Algorithme PCA le plus rapide pour les données de grande dimension


11

Je voudrais effectuer une PCA sur un ensemble de données composé d'environ 40 000 échantillons, chaque échantillon affichant environ 10 000 fonctionnalités.

L'utilisation de la fonction Matlab princomp prend systématiquement plus d'une demi-heure, moment auquel je tue le processus. Je voudrais trouver une implémentation / algorithme qui fonctionne en moins de 10 minutes. Quel serait l'algorithme le plus rapide? Combien de temps cela prendrait-il sur un Ram i7 dual core / 4 Go?


Oui, vous avez raison, je devrais être plus précis. Cela prend plus d'une demi-heure, puis j'ai décidé de tuer le processus. Je dois le faire au moins dix fois, ce serait bien d'avoir quelque chose qui fonctionne en moins de 10 minutes
moelleux

Quelle est la densité de votre matrice?
Arnold Neumaier

Le pourcentage de zéros dans la matrice est supérieur à 80%
doux

Découvrez également kernal-PCA.
meawoppl

Réponses:


11

Tout d'abord, vous devez préciser si vous souhaitez tous les composants ou les plus importants?

Notons votre matrice avec N étant le nombre d'échantillons et M la dimensionnalité.UNERN×MNM

Dans le cas où vous souhaitez que tous les composants, la méthode classique consiste à calculer la matrice de covariance (qui a une complexité temporelle de O ( N M 2 ) ), puis à lui appliquer SVD ( O supplémentaire ( M 3 ) ). En termes de mémoire, cela prendrait O ( 2 M 2 ) (matrice de covariance + vecteurs singuliers et valeurs formant une base orthogonale) ou 1,5 Go en double précision pour votre A particulier .CRM×MO(NM2)O(M3)O(2M2)1,5UNE

Vous pouvez appliquer SVD directement à la matrice si vous normalisez chaque dimension avant cela et prenez des vecteurs singuliers gauches. Cependant, pratiquement je m'attendrais à ce que la SVD de la matrice A prenne plus de temps.UNEUNE

Si vous n'avez besoin que d'une fraction des composants (peut-être les plus importants), vous pouvez appliquer l' APC itérative . Pour autant que je sache, tous ces algorithmes sont étroitement liés au processus de Lanczos, vous êtes donc tributaire du spectre du et pratiquement il sera difficile d'atteindre la précision de la SVD pour les vecteurs obtenus et il se dégradera avec le nombre de vecteurs singuliers.C


2

Je suppose que vous n'avez besoin que de quelques (ou quelques centaines) paires de valeurs / vecteurs singulières dominantes. Ensuite, il est préférable d'utiliser une méthode itérative, qui sera beaucoup plus rapide et consommera beaucoup moins de mémoire.

Dans Matlab, voir

aide svds


Oui, il semble que les méthodes itératives soient beaucoup plus rapides si je n'ai besoin que des cent premiers composants.
moelleux

En ce qui concerne les svds, j'ai essayé de mettre ma matrice dans un format clairsemé et de modifier la fonction princomp pour mettre des svds au lieu de svd, et à ma grande surprise, cela a pris beaucoup plus de temps sur une matrice 2000 * 4000 (180 s au lieu de 15s ). Bizarre ...
moelleux

1
Il n'est pas nécessaire de passer au format clairsemé. De plus, vous devez réduire le nombre de vecteurs singuliers que vous souhaitez calculer. Pour calculer le svd complet, svds ne convient pas.
Arnold Neumaier

2
À noter également pour les modes dominants, les nouvelles méthodes svd randomisées, comme dans stanford.edu/group/mmds/slides2010/Martinsson.pdf
Nick Alger le


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.