9
votes

Comment blanchir matrice en PCA

Je travaille avec Python et j'ai mis en œuvre la PCA à l'aide de Ce didacticiel .

Tout fonctionne bien, j'ai eu la covariance que j'ai fait une transformation réussie, apporté cela aux dimensions originales, pas de problème.

Mais comment puis-je effectuer un blanchiment? J'ai essayé de diviser les eigenvectors par les eigenvalues: xxx

et utilisé v pour transformer les données, mais cela a conduit à des valeurs de données étranges. Quelqu'un pourrait-il pleurer une lumière sur cela?


1 commentaires

Vous voudrez peut-être essayer un lieu de mathématique plus spécifique, peut-être une liste de diffusion associée à des numéros ou à des scies.


3 Réponses :


1
votes

Je pense que vous devez transposer V et prendre la racine carrée de S. Donc, la formule est

matrix_to_multiphe_with_data = transpose (v) * s ^ (- 1/2)


0 commentaires

23
votes

Voici une implémentation numpie de certains code MATLAB pour le blanchiment de matrice, j'ai eu de ici .

def svd_whiten(X):

    U, s, Vt = np.linalg.svd(X, full_matrices=False)

    # U and Vt are the singular matrices, and s contains the singular values.
    # Since the rows of both U and Vt are orthonormal vectors, then U * Vt
    # will be white
    X_white = np.dot(U, Vt)

    return X_white


9 commentaires

Merci! Le SVD ne devrait-il pas être effectué sur la matrice de covariance de x?


@Ran je pense que vous confondez SVD avec une eigendecomposition. Utilisation de la méthode SVD, vous ne calculez pas explicitement la matrice de covariance à l'avance - les colonnes de u contiendront les eigenvectors de x * xt et les lignes de VT contient les vecteurs Eigenvectors de xt * x . Étant donné que les lignes de u et vt sont des vecteurs orthonormaux, la matrice de covariance de u.dot (VT) sera l'identité.


Tous les autres exemples que j'ai vu effectuer le SVD sur la matrice de covariance, par exemple GIST.GITUB.COM/DUSCHENSESTROYER/5170087 .


@Ran l'exemple que vous venez de lier à Affiche blanchisseur de zca , qui est l'un des de nombreuses façons différentes de blanchir une matrice. Pour toute matrice orthogonale r , r * x_white aura également une covariance d'identité. Dans ZCA, r est choisi pour être u (c'est-à-dire les vecteurs Eigenvectors de x * x.t ). Cette transformation particulière entraîne des données blanchies aussi proches que possible de x (dans le sens des moindres carrés). Si vous voulez juste des données blanchies, vous pouvez calculer x_white comme ci-dessus (regardez les valeurs dans x_white.t * x_white si vous ne me croyez pas).


Attention aux gens que cela est vrai juste pour les matrices symétriques .. :)


@Asdf L'approche SVD fonctionnera également pour des entrées non carrées si vous passez FULL_MATRICES = FALSE à np.linalg.svd (voir ma mise à jour). De manière équivalente, vous pouvez remplacer les valeurs singulières avec une matrice d'identité d'observations par composants, par ex. u.dot (np.eye (* x.shape)). Dot (VT) , mais il est moins cher à simplement éviter de calculer les matrices complètes pour u et et VT .


Le résultat de la première et de la deuxième solution est différent pour une matrice de 3 * 2 comme ([1,2], [2,4], [3,6]). SVD supprime la linéarité mais la première ne pas


Bonjour, je pense que vos calculs de matrice de covariance supposent que les données ont déjà été centrées à zéro, non?


Cher Ali_M, Cette méthode est-elle appropriée pour un grand nombre de données par exemple 400 numéro?



12
votes

Si vous utilisez la bibliothèque SCIKIT-HALL de Python pour cela, vous pouvez simplement définir le paramètre intégré

from sklearn.decomposition import PCA
pca = PCA(whiten=True)
whitened = pca.fit_transform(X)


0 commentaires