J'aimerais utiliser l'analyse en composantes principales (ACP) pour la réduction de la dimensionnalité. Est-ce que Numpy ou Scipy l'a déjà, ou dois-je utiliser le mien numpy.linalg.eigh
?
Je ne veux pas simplement utiliser la décomposition en valeurs singulières (SVD) car mes données d'entrée sont assez dimensionnelles (~ 460 dimensions), donc je pense que SVD sera plus lent que le calcul des vecteurs propres de la matrice de covariance.
J'espérais trouver une implémentation prédéfinie et déboguée qui prend déjà les bonnes décisions pour savoir quand utiliser quelle méthode, et qui peut peut-être faire d'autres optimisations que je ne connais pas.
Note that from this release MDP is in maintenance mode. 13 years after its first public release, MDP has reached full maturity and no new features are planned in the future.
Quelques mois plus tard, voici un petit PCA de classe et une photo:
la source
L'utilisation de PCA
numpy.linalg.svd
est super facile. Voici une démo simple:la source
svd
renvoie déjàs
trié par ordre décroissant, dans la mesure où la documentation va. (Ce n'était peut-être pas le cas en 2012, mais c'est le cas aujourd'hui)Vous pouvez utiliser sklearn:
la source
matplotlib.mlab a une implémentation PCA .
la source
SVD devrait fonctionner correctement avec 460 dimensions. Cela prend environ 7 secondes sur mon netbook Atom. La méthode eig () prend plus de temps (comme il se doit, elle utilise plus d'opérations en virgule flottante) et sera presque toujours moins précise.
Si vous avez moins de 460 exemples, ce que vous voulez faire est de diagonaliser la matrice de dispersion (x - datamean) ^ T (x - mean), en supposant que vos points de données sont des colonnes, puis multiplier à gauche par (x - datamean). Cela peut être plus rapide dans le cas où vous avez plus de dimensions que de données.
la source
Vous pouvez facilement "rouler" le vôtre en utilisant
scipy.linalg
(en supposant un jeu de données pré-centrédata
):Puis
evs
sont vos valeurs propres etevmat
votre matrice de projection.Si vous souhaitez conserver les
d
dimensions, utilisez les premièresd
valeurs propres et les premiersd
vecteurs propres.Étant donné que
scipy.linalg
la décomposition et la numpy des multiplications de la matrice sont associées, de quoi d'autre avez-vous besoin?la source
eig()
sur une matrice de covariance.Je viens de finir de lire le livre Machine Learning: An Algorithmic Perspective . Tous les exemples de code du livre ont été écrits par Python (et presque avec Numpy). L'extrait de code de l' analyse des composants principaux de chatper10.2 vaut peut-être la peine d'être lu. Il utilise numpy.linalg.eig.
Au fait, je pense que SVD peut très bien gérer les dimensions 460 * 460. J'ai calculé un SVD 6500 * 6500 avec numpy / scipy.linalg.svd sur un très vieux PC: Pentium III 733mHz. Pour être honnête, le script a besoin de beaucoup de mémoire (environ 1.xG) et de beaucoup de temps (environ 30 minutes) pour obtenir le résultat SVD. Mais je pense que 460 * 460 sur un PC moderne ne sera pas un gros problème à moins que vous n'ayez besoin de faire SVD un grand nombre de fois.
la source
Vous n'avez pas besoin de la décomposition en valeurs singulières (SVD) complète car elle calcule toutes les valeurs propres et tous les vecteurs propres et peut être prohibitive pour les grandes matrices. scipy et son module sparse fournissent des fonctions d'algèbre linéaire génériques fonctionnant à la fois sur des matrices clairsemées et denses, parmi lesquelles se trouve la famille de fonctions eig *:
http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html#matrix-factorizations
Scikit-learn fournit une implémentation Python PCA qui ne prend en charge que les matrices denses pour le moment.
Horaires:
la source
eigsh
est en fait ~ 4x plus lent queeigh
pour les matrices non analysées. La même chose est vraie pourscipy.sparse.linalg.svds
versusnumpy.linalg.svd
. J'irais toujours avec SVD sur la décomposition des valeurs propres pour les raisons mentionnées par @dwf, et j'utiliserais peut-être une version éparse de SVD si les matrices deviennent vraiment énormes.eigsh
etsvds
sont plus rapides queeigh
etsvd
d'un facteur de ~ 3, mais si A est plus petit, disons 100 * 100, alorseigh
etsvd
sont plus rapides par des facteurs de ~ 4 et ~ 1,5 respectivement . Cependant, T utiliserait encore une SVD clairsemée sur une décomposition en valeurs propres clairsemée.Voici une autre implémentation d'un module PCA pour python utilisant numpy, scipy et C-extensions. Le module exécute l'ACP en utilisant soit un SVD soit l'algorithme NIPALS (Nonlinear Iterative Partial Least Squares) qui est implémenté en C.
la source
Si vous travaillez avec des vecteurs 3D, vous pouvez appliquer SVD de manière concise à l'aide de la toolbelt vg . C'est une couche légère au-dessus de numpy.
Il existe également un alias pratique si vous ne voulez que le premier composant principal:
J'ai créé la bibliothèque lors de ma dernière startup, où elle était motivée par des usages comme celui-ci: des idées simples qui sont verbeuses ou opaques dans NumPy.
la source