2016-10-05 4 views
1

Ich habe eine Frage zu numpy.linalg.eig().Gesundheit Überprüfung der Ausgabe von Python numpy eigig() Funktion

Hier ist meine Kovarianzmatrix nach Normalisierung/Standardisierung der Daten.

lr_cov = np.cov(lr_norm, rowvar = False, ddof = 0) 
lr_cov 

array([[ 0.95454545, 0.88156287, 0.8601369 ], 
     [ 0.88156287, 0.95454545, 0.87367031], 
     [ 0.8601369 , 0.87367031, 0.95454545]]) 

Ich benutze das eig() Funktion, wie unten - keine Probleme hier.

eig_val, eig_vec = np.linalg.eig(lr_cov) 

eig_vec 

array([[-0.57694452, -0.6184592 , 0.53351967], 
     [-0.57990975, -0.14982268, -0.80078577], 
     [-0.57518668, 0.77140222, 0.27221115]]) 

eig_val 

array([ 2.69815538, 0.09525935, 0.07022164]) 

Aber wenn ich zu Plausibilitätsprüfung ausgehen, dass (Kovarianzmatrix) * (Eigenvektor) = (Eigenwert) * (Eigen Vector), die LHS und RHS in diesem Fall passen nicht auf.

lr_cov*eig_vec 

array([[-0.55071977, -0.54521067, 0.45889996], 
     [-0.5112269 , -0.14301256, -0.69962276], 
     [-0.49473928, 0.67395122, 0.25983791]]) 

eig_val*eig_vec 

array([[-1.55668595, -0.05891402, 0.03746463], 
     [-1.5646866 , -0.01427201, -0.05623249], 
     [-1.55194302, 0.07348327, 0.01911511]]) 

Was mache ich falsch?

Antwort

0

Zwei Punkte:

  • * ist elementweise multipication. Verwenden Sie die Methode dot() für die Matrixmultiplikation.
  • eig_val ist ein 1d-Array. Konvertieren Sie es in ein 2D-Quadrat-Diagonal-Array mit np.diag(eig_val).

Beispiel:

In [70]: cov 
Out[70]: 
array([[ 0.95454545, 0.88156287, 0.8601369 ], 
     [ 0.88156287, 0.95454545, 0.87367031], 
     [ 0.8601369 , 0.87367031, 0.95454545]]) 

In [71]: eig_val, eig_vec = np.linalg.eig(cov) 

In [72]: cov.dot(eig_vec) 
Out[72]: 
array([[-1.55668595, -0.05891401, 0.03746463], 
     [-1.56468659, -0.01427202, -0.05623249], 
     [-1.55194302, 0.07348327, 0.01911511]]) 

In [73]: eig_vec.dot(np.diag(eig_val)) 
Out[73]: 
array([[-1.55668595, -0.05891401, 0.03746463], 
     [-1.56468659, -0.01427202, -0.05623249], 
     [-1.55194302, 0.07348327, 0.01911511]]) 

In der letzten Zeile ist np.diag(eig_val) auf der rechten Seite, um jede Spalte von eig_vec durch den entsprechenden Eigenwert zu multiplizieren.

Wenn Sie die Vorteile von numpy Rundfunk nehmen, Sie haben nicht np.diag(eig_val) zu verwenden, und Sie können elementweise Multiplikation verwenden (in beliebiger Reihenfolge, da elementweise Multiplikation kommutativ ist):

In [75]: eig_vec * eig_val # element-wise multiplication with broadcasting 

Out[75]: 
array([[-1.55668595, -0.05891401, 0.03746463], 
     [-1.56468659, -0.01427202, -0.05623249], 
     [-1.55194302, 0.07348327, 0.01911511]]) 

In [76]: eig_val * eig_vec 
Out[76]: 
array([[-1.55668595, -0.05891401, 0.03746463], 
     [-1.56468659, -0.01427202, -0.05623249], 
     [-1.55194302, 0.07348327, 0.01911511]]) 
+0

Nizza ein Warren - danke! Das hat den Trick gemacht. – skafetaur

Verwandte Themen