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. P>
Mais comment puis-je effectuer un blanchiment? J'ai essayé de diviser les eigenvectors par les eigenvalues: p> 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? P> p>
3 Réponses :
Je pense que vous devez transposer V et prendre la racine carrée de S. Donc, la formule est p>
matrix_to_multiphe_with_data = transpose (v) * s ^ (- 1/2) p>
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
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 code> contiendront les eigenvectors de
x * xt code> et les lignes de
VT Code> contient les vecteurs Eigenvectors de
xt * x code>. Étant donné que les lignes de
u code> et
vt code> sont des vecteurs orthonormaux, la matrice de covariance de
u.dot (VT) code> 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 code>,
r * x_white code> aura également une covariance d'identité. Dans ZCA,
r code> est choisi pour être
u code> (c'est-à-dire les vecteurs Eigenvectors de
x * x.t code>). Cette transformation particulière entraîne des données blanchies aussi proches que possible de
x code> (dans le sens des moindres carrés). Si vous voulez juste des données blanchies, vous pouvez calculer
x_white code> comme ci-dessus (regardez les valeurs dans
x_white.t * x_white code> 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 code> à
np.linalg.svd code> (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) code>, mais il est moins cher à simplement éviter de calculer les matrices complètes pour
u code> et
et
VT code>.
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?
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)
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.