2014-07-23 4 views
8

In lettura Abdi & Williams (2010) "Analisi componente principale" e sto cercando di ripetere l'SVD per ottenere valori per ulteriore PCA.Utilizzo di Numpy (np.linalg.svd) per la decomposizione del valore singolare

L'articolo afferma che a seguito di SVD:

X = PDQ^t

io carico i miei dati in un np.array X.

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

Ma non ho ricevuto l'uguaglianza sopra quando si verifica con

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

X_a e X sono le stesse dimensioni, ma i valori non sono uguali . Mi manca qualcosa, o la funzionalità della funzione np.linalg.svd non è compatibile in qualche modo con l'equazione nella carta?

risposta

12

TL; DR: SVD di numpy calcola X = PDQ, quindi Q è già trasposto.

SVD scompone la matrice X efficacemente in rotazioni P e Q e la matrice diagonale D. La versione di linalg.svd() I ha restituisce rotazioni di inoltro per P e Q. Non si desidera trasformare Q quando si calcola X_a.

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)) 

ottengo: 1.02, 1.02, 1.8E-15, dimostrando che X_a ricostruisce con grande precisione X.

4

Dal docstring scipy.linalg.svd, dove (M, N) è la forma della matrice di ingresso, e K è il minore dei due:

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, come descritto, è il trasposizione della Q utilizzata nella carta Abdi e Williams. Quindi, solo

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

dovrebbe darti la risposta.