Pour effectuer une analyse en composantes principales (ACP), vous devez soustraire la moyenne de chaque colonne des données, calculer la matrice des coefficients de corrélation, puis trouver les vecteurs propres et les valeurs propres. Eh bien, c'est plutôt ce que j'ai fait pour l'implémenter en Python, sauf qu'il ne fonctionne qu'avec de petites matrices car la méthode pour trouver la matrice de coefficients de corrélation (corrcoef) ne me permet pas d'utiliser un tableau avec une dimensionnalité élevée. Étant donné que je dois l'utiliser pour des images, mon implémentation actuelle ne m'aide pas vraiment.
J'ai lu qu'il est possible de simplement prendre votre matrice de données et de calculer au lieu de , mais cela ne fonctionne pas pour moi. Eh bien, je ne suis pas exactement sûr de comprendre ce que cela signifie, outre le fait qu'il est censé être une matrice au lieu de (dans mon cas ). J'ai lu à propos de ceux dans les tutoriels Eigenfaces mais aucun d'eux ne semblait l'expliquer de telle manière que je pouvais vraiment l'obtenir.D D ⊤ / n D ⊤ D / n n × n p × p p ≫ n
En bref, existe-t-il une description algorithmique simple de cette méthode pour que je puisse la suivre?
Réponses:
La façon la plus simple de faire une PCA standard est de centrer les colonnes de votre matrice de données (en supposant que les colonnes correspondent à différentes variables) en soustrayant les moyennes des colonnes, puis d'effectuer une SVD. Les vecteurs singuliers de gauche, multipliés par la valeur singulière correspondante, correspondent aux composantes principales (estimées). Les vecteurs singuliers de droite correspondent aux directions des composantes principales (estimées) - ce sont les mêmes que les vecteurs propres donnés par l'ACP. Les valeurs singulières correspondent aux écarts-types des composants principaux (multipliés par un facteur de racine n, où n est le nombre de lignes dans votre matrice de données) - les mêmes que la racine carrée des valeurs propres données par PCA.
Si vous voulez faire PCA sur la matrice de corrélation, vous devrez standardiser les colonnes de votre matrice de données avant d'appliquer le SVD. Cela revient à soustraire les moyennes (centrage) puis à les diviser par les écarts-types (mise à l'échelle).
Ce sera l'approche la plus efficace si vous voulez le PCA complet. Vous pouvez vérifier avec une algèbre que cela vous donne la même réponse que la décomposition spectrale de la matrice de covariance de l'échantillon.
Il existe également des méthodes efficaces pour calculer un SVD partiel, lorsque vous n'avez besoin que de quelques PC. Certains d'entre eux sont des variantes de l'itération de puissance. L' algorithme de Lanczos est un exemple également lié aux moindres carrés partiels. Si votre matrice est énorme, vous pourriez être mieux avec une méthode approximative. Il existe également des raisons statistiques de régulariser l'APC lorsque c'est le cas.
la source
Ce que vous faites en ce moment est proche, mais vous devez vous assurer de multiplier les vecteurs propres de
(data . data.T) / lines
gauche pardata.T
, afin d'obtenir les vecteurs propres de(data.T . data) / lines
. C'est ce qu'on appelle parfois le "truc de transposition".Voici quelques détails supplémentaires. Supposons que vous ayez une matrice laquelle vous souhaitez effectuer PCA; pour simplifier, supposons que les colonnes de ont déjà été normalisées pour avoir une moyenne nulle, de sorte qu'il suffit de calculer les vecteurs propres de la matrice de covariance .A A ATA
Maintenant, si est une matrice , avec , alors est une matrice très grande . Ainsi, au lieu de calculer les vecteurs propres de , nous aimerions peut-être calculer les vecteurs propres de la matrice beaucoup plus petite - en supposant que nous pouvons trouver une relation entre les deux. Alors, comment les vecteurs propres de liés aux vecteurs propres de ?A m×n n>>m ATA n×n ATA m×m AAT ATA AAT
Soit un vecteur propre de avec valeur propre . Puisv AAT λ
En d'autres termes, si est un vecteur propre de , alors est un vecteur propre de , avec la même valeur propre. Ainsi, lorsque vous effectuez un PCA sur , au lieu de trouver directement les vecteurs propres de (qui peuvent être très chers), il est plus facile de trouver les vecteurs propres de , puis de les multiplier à gauche par pour obtenir les vecteurs propres de .A A T A T v A T A A A T A v A A T A T A T v A T Av AAT ATv ATA A ATA v AAT AT ATv ATA
la source
Cela ressemble à ce que vous voulez, c'est l'algorithme NIPALS pour effectuer l'ACP. C'est un algorithme très populaire parmi les statisticiens. Elle présente de nombreux avantages:
Description
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares
Algorithme
Voici une description simple et excellente de l'algorithme (dans la section 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf
N'oubliez pas de signifier échelle centrale avant de faire de l'ACP car il est sensible à l'échelle.
la source
Pour ajouter à la réponse de Gilead, ce sont des algorithmes moins coûteux en termes de calcul pour les PCA tronqués. NIPALS est en effet très populaire, mais j'ai eu beaucoup de succès avec des méthodes approximatives qui effectuent une succession d'ajustements sur des données partielles (ce qui est souvent appelé PCA par projection aléatoire). Cela a été discuté dans un fil de méta - optimisation .
Comme vous mentionnez Python, permettez-moi de souligner que l'algorithme est implémenté dans le scikit-learn : la classe PCA . En particulier, il est utilisé dans un exemple de démonstration de faces propres .
la source