Utilisation de Numpy (np.linalg.svd) pour la Décomposition en valeurs Singulières
Im lire Abdi & Williams (2010) "l'Analyse en composantes Principales", et je suis en train de refaire la SVD pour atteindre des valeurs pour plus de PCA.
L'article indique qu'à la suite de SVD:
X = P D Q^t
- Je charger mes données dans un np.tableau X.
X = np.array(data)
P, D, Q = np.linalg.svd(X, full_matrices=False)
D = np.diag(D)
Mais je n'ai pas le au-dessus de l'égalité lors de la vérification avec
X_a = np.dot(np.dot(P, D), Q.T)
X_a et X ont les mêmes dimensions, mais les valeurs ne sont pas les mêmes. Ai-je raté quelque chose, ou est la fonctionnalité de la np.linalg.svd fonction n'est pas compatible en quelque sorte avec l'équation dans le document?
OriginalL'auteur dms_quant | 2014-07-23
Vous devez vous connecter pour publier un commentaire.
TL;DR: numpy du SVD calcule X = PDQ, de sorte que le Q est déjà transposé.
SVD de décomposition de la matrice
X
efficacement dans les rotationsP
etQ
et la diagonale de la matriceD
. La version delinalg.svd()
j'ai des retours en avant des rotations pourP
etQ
. Vous ne voulez pas transformerQ
lorsque vous calculezX_a
.J'obtiens: 1.02, 1.02, 1,8 e-15, montrant que
X_a
très fidèlement reconstruitX
.Si vous utilisez Python 3, le
@
opérateur met en œuvre la multiplication de matrice et rend le code plus facile à suivre:np.matmul
est préféré pour la multiplication matricielleDe réponses mis à jour par Rodrigo commentaire. Également ajouté les plus récents, " @ " de la notation.
OriginalL'auteur Frank M
De la scipy.linalg.svd docstring, où (M,N) est la forme de la matrice d'entrée, et K est la plus petite des deux:
Vh, tel que décrit, est la transposition de la Q utilisé dans le Abdi et Williams papier. Donc, juste
doit vous donner votre réponse.
OriginalL'auteur eewallace