Cette question concerne un moyen efficace de calculer les principaux composants.
De nombreux textes sur l'ACP linéaire préconisent l'utilisation de la décomposition en valeurs singulières des données casewise . Autrement dit, si nous avons des données et que nous voulons remplacer les variables (ses colonnes ) par des composants principaux, nous faisons SVD: , des valeurs singulières (racines carrées des valeurs propres) occupant la diagonale principale de , vecteurs propres droits sont la matrice de rotation orthogonale des variables-axes en composantes-axes, les vecteurs propres gauche sont comme , seulement pour les cas. Nous pouvons alors calculer les valeurs des composants comme .
Une autre façon de réaliser l'ACP des variables consiste à décomposer la matrice carrée (c'est-à-dire que peut être des corrélations ou des covariances, etc., entre les variables). La décomposition peut être une décomposition propre ou une décomposition en valeurs singulières: avec une matrice semi-définie positive symétrique carrée, ils donneront le même résultat avec des valeurs propres comme la diagonale de et comme décrit précédemment. Les valeurs des composants seront .
Maintenant, ma question: si les données sont une grande matrice et que le nombre de cas est (ce qui est souvent un cas) beaucoup plus grand que le nombre de variables, alors la voie (1) devrait être beaucoup plus lente que la voie (2), parce que way (1) applique un algorithme assez cher (tel que SVD) à une grande matrice; il calcule et stocke une énorme matrice dont nous n'avons vraiment pas besoin dans notre cas (le PCA des variables). Si c'est le cas , pourquoi tant de texbooks semblent-ils préconiser ou simplement mentionner la seule façon (1)? Peut-être qu'il est efficace et je manque quelque chose?
la source
R
svd
Joliffe, Principal component analysis, 2nd ed.
chose à mentionner, en fait, Joliffe décrit les deux façons, mais dans le chapitre central sur PCA, il dit à propos de la voie 1, pour autant que je me souvienne.Réponses:
Voici mon 2ct sur le sujet
La conférence de chimiométrie où j'ai d'abord appris la PCA a utilisé la solution (2), mais elle n'était pas orientée vers le numérique, et ma conférence de numérique n'était qu'une introduction et n'a pas discuté de SVD pour autant que je m'en souvienne.
Si je comprends bien Holmes: Fast SVD for Large-Scale Matrices , votre idée a été utilisée pour obtenir un SVD rapide sur le plan des matrices longues.
Cela signifierait qu'une bonne implémentation SVD peut suivre en interne (2) si elle rencontre des matrices appropriées (je ne sais pas s'il existe encore de meilleures possibilités). Cela signifierait que pour une implémentation de haut niveau, il est préférable d'utiliser le SVD (1) et de laisser au BLAS le soin de choisir l'algorithme à utiliser en interne.
Vérification pratique rapide: le svd d'OpenBLAS ne semble pas faire cette distinction, sur une matrice de 5e4 x 100,
svd (X, nu = 0)
prend 3,5 s médian, toutsvd (crossprod (X), nu = 0)
en 54 ms (appelé depuis R avecmicrobenchmark
).La quadrature des valeurs propres est bien sûr rapide, et jusqu'à ce que les résultats des deux appels soient équivalents.
mise à jour: Jetez un œil à Wu, W .; Massart, D. & de Jong, S .: Les algorithmes PCA du noyau pour les données étendues. Partie I: Théorie et algorithmes, Chemometrics and Intelligent Laboratory Systems, 36, 165 - 172 (1997). DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5
Cet article discute des propriétés numériques et informatiques de 4 algorithmes différents pour l'ACP: SVD, décomposition propre (EVD), NIPALS et POWER.
Ils sont liés comme suit:
Le contexte de l'article est large , et ils fonctionnent sur X X ' (noyau PCA) - c'est juste la situation opposée à celle que vous demandez. Donc, pour répondre à votre question sur le comportement à longue matrice, vous devez échanger la signification de "noyau" et "classique".X(30×500) XX′
Sans surprise, EVD et SVD changent de place selon que les algorithmes classiques ou noyau sont utilisés. Dans le contexte de cette question, cela signifie que l'un ou l'autre peut être meilleur selon la forme de la matrice.
Mais à partir de leur discussion sur les SVD et EVD "classiques", il est clair que la décomposition de est un moyen très courant de calculer l'APC. Cependant, ils ne spécifient pas quel algorithme SVD est utilisé autre que celui qu'ils utilisent la fonction de Matlab .X′X
svd ()
la source
svd (X'X)
matrices longues.)microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)
peut aussi être intéressant.La SVD est plus lente mais est souvent considérée comme la méthode préférée en raison de sa précision numérique plus élevée.
Voici ce qui est écrit dans l' aide de la
pca()
fonction de MATLAB :La dernière phrase met en évidence le compromis crucial entre vitesse et précision qui est en jeu ici.
obtenir des résultats identiques:
Je dois ajouter que l'on est souvent heureux d'ignorer cette perte de précision [minuscule] potentielle et d'utiliser plutôt la méthode plus rapide.
la source
eig()
approche? (Les lecteurs en bénéficieront: il y a un compromis entre vitesse et stabilité. Comment décider dans une situation concrète?)3 0 -3.3307e-16
eigen dans spss, je suis retourné3 0 0
. Il semble que la fonction ait une certaine valeur de tolérance intégrée et fixe au-delà de laquelle elle se réinitialise. Dans cet exemple, la fonction est apparue comme pour pirater le nœud de l'instabilité numérique en mettant à zéro les deux petites valeurs propres, le «0» et le «-16».