Comment réaliser l'ACP pour des données de très grande dimensionnalité?

12

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 nDDD/nDD/nn×np×ppn

En bref, existe-t-il une description algorithmique simple de cette méthode pour que je puisse la suivre?

amibe dit réintégrer Monica
la source
Ce que vous lisez est correct. La matrice est appelée matrice de Gram. Ses vecteurs propres sont des composants principaux (à l'échelle). Ses valeurs propres sont exactement identiques, jusqu'au facteur , aux valeurs propres de la matrice de covariance . DD1/nDD/n
Amoeba dit Reinstate Monica

Réponses:

10

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.

vqv
la source
Corrigez-moi si je me trompe, mais je pense que l'algorithme de Lanczos effectue la composition par eigendec et non la SVD.
Amoeba dit Reinstate Monica
1
Un lecteur intéressé peut consulter ici pour plus de détails sur la réalisation de l'ACP via SVD: Relation entre SVD et PCA. Comment utiliser SVD pour effectuer PCA?
Amoeba dit Reinstate Monica
10

Ce que vous faites en ce moment est proche, mais vous devez vous assurer de multiplier les vecteurs propres de (data . data.T) / linesgauche par data.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 .AAATA

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 ?Am×nn>>mATAn×nATAm×mAATATAAAT

Soit un vecteur propre de avec valeur propre . PuisvAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

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 AvAATATvATAAATAvAATATATvATA

raegtin
la source
1
Cela ressemble au "truc du noyau" appliqué à PCA. en.wikipedia.org/wiki/Kernel_PCA C'est un très bon moyen de gérer certaines grandes matrices.
Gilead
+1. On devrait peut-être ajouter que est appelé la matrice de Gram. AA
Amoeba dit Reinstate Monica
8

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:

  • Calcul moins coûteux que les méthodes de décomposition SVD ou à valeurs propres si seuls les premiers composants sont nécessaires.
  • A des besoins de stockage plus modestes en général car la matrice de covariance n'est jamais formée. Il s'agit d'une propriété très importante pour les très grands ensembles de données.
  • Peut gérer les données manquantes dans l'ensemble de données (bien que ce ne soit pas un problème dans votre problème, car vous avez affaire à des images).

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.

Gilead
la source
4

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 .

Gael Varoquaux
la source