2014-07-23 11 views
8

Im Abdi lesen & Williams (2010) "Hauptkomponentenanalyse", und ich versuche, die SVD zu wiederholen, um Werte für weitere PCA zu erreichen.Verwenden von Numpy (np.linalg.svd) für Singularwertzerlegung

Der Artikel besagt, dass SVD folgende:

X = PDQ^t

ich meine Daten in einem np.array X. laden

X = np.array(data) 
P, D, Q = np.linalg.svd(X, full_matrices=False) 
D = np.diag(D) 

Aber ich nicht bekommen, die über Gleichheit bei der Überprüfung mit

X_a = np.dot(np.dot(P, D), Q.T) 

X_a und X sind die gleichen Abmessungen, aber die Werte sind nicht gleich . Fehle ich etwas oder ist die Funktionalität der Funktion np.linalg.svd nicht irgendwie mit der Gleichung in der Zeitung kompatibel?

Antwort

12

TL; DR: numpys SVD berechnet X = PDQ, daher ist das Q bereits transponiert.

SVD zerlegt die Matrix X effektiv in die Rotationen P und Q und die Diagonalmatrix D. Die Version linalg.svd() Ich habe Vorwärtsrotationen für P und Q. Sie möchten Q nicht umwandeln, wenn Sie X_a berechnen.

import numpy as np 
X = np.random.normal(size=[20,18]) 
P, D, Q = np.linalg.svd(X, full_matrices=False) 
X_a = np.dot(np.dot(P, np.diag(D)), Q) 
print(np.std(X), np.std(X_a), np.std(X - X_a)) 

ich: 1.02, 1.02, 1.8E-15, die zeigen, dass X_a sehr genau X rekonstruiert.

4

Vom scipy.linalg.svd docstring, wobei (M, N) ist die Form der Eingangsmatrix, und K ist die kleinere der beiden:

Returns 
------- 
U : ndarray 
    Unitary matrix having left singular vectors as columns. 
    Of shape ``(M,M)`` or ``(M,K)``, depending on `full_matrices`. 
s : ndarray 
    The singular values, sorted in non-increasing order. 
    Of shape (K,), with ``K = min(M, N)``. 
Vh : ndarray 
    Unitary matrix having right singular vectors as rows. 
    Of shape ``(N,N)`` or ``(K,N)`` depending on `full_matrices`. 

Vh, wie beschrieben, ist der Transponieren des Q, das in den Abdi und Williams Papieren verwendet wird. Also einfach

X_a = P.dot(D).dot(Q) 

sollte Ihnen Ihre Antwort geben.