Enkelvoudig matrixprobleem met Numpy

Ik probeer een vector (3 bij 1) te vermenigvuldigen met zijn transponering (1 bij 3). Ik krijg een (3 bij 3) array, maar ik kan de inverse ervan niet krijgen. Enig idee waarom?

import numpy as np
c=array([1, 8, 50])
np.transpose(c[np.newaxis]) * c
array([[   1,    8,   50],
   [   8,   64,  400],
   [  50,  400, 2500]])
np.linalg.inv(np.transpose(c[np.newaxis]) * c)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 445, in inv
    return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
  File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 328, in solve
    raise LinAlgError, 'Singular matrix'
LinAlgError: Singular matrix

Antwoord 1, autoriteit 100%

De matrix die je hebt geplakt

[[   1,    8,   50],
 [   8,   64,  400],
 [  50,  400, 2500]]

Heeft een determinant van nul. Dit is de definitie van een singuliere matrix (een waarvoor geen inverse bestaat)

http://en.wikipedia.org/wiki/Invertible_matrix


Antwoord 2, autoriteit 76%

Door een 1D-vector te vermenigvuldigen met zijn transponering, heb je per definitie een singuliere matrix gemaakt.

Elke rij is een lineaire combinatie van de eerste rij.

Merk op dat de tweede rij slechts 8x de eerste rij is.

Evenzo is de derde rij 50x de eerste rij.

Er is maar één onafhankelijke rij in je matrix.


Antwoord 3, autoriteit 41%

Zoals in eerdere antwoorden al genoemd, kan je matrix niet worden omgekeerd, omdat de determinant 0 is.
Maar als u toch een inverse matrix wilt krijgen, kunt u np.linalg.pinvgebruiken, die SVD gebruikt om de initiële matrix te benaderen.


Antwoord 4

Gebruik SVD of QR-decompositie om de exacte oplossing te berekenen in velden met reële of complexe getallen:

numpy.linalg.svd
numpy.linalg.qr

Other episodes