L'article de Wikipedia sur l' analyse des composants principaux indique que
Il existe des algorithmes efficaces pour calculer la SVD de sans avoir à former la matrice , donc le calcul de la SVD est désormais le moyen standard de calculer une analyse des composants principaux à partir d'une matrice de données, à moins qu'une poignée de composants seulement soit requise.
Quelqu'un pourrait-il me dire quels sont les algorithmes efficaces dont parle l'article? Aucune référence n'est donnée (URL ou citation d'un article proposant ce mode de calcul serait bien).
Réponses:
Le principal cheval de bataille derrière le calcul de SVD est l' algorithme QR . Cela dit , il existe de nombreux algorithmes différents pour calculer la décomposition en valeurs singulières d'un générique de matrice . Un excellent schéma sur le problème disponible ici (à partir de la documentation du MKL d'Intel ) est le suivant:M N UNE
Comme vous le voyez, selon votre cas d'utilisation, il existe différentes approches (les conventions de dénomination de routine peuvent être trouvées ici ). C'est parce que, par exemple, il existe des formes matricielles où une réduction du nombre de ménages peut être plus coûteuse qu'une rotation de Givens (pour nommer deux façons "évidentes" d'obtenir QR). Une référence standard en la matière est les calculs matriciels de Golub et Van Loan (je suggérerais d'utiliser au moins la 3e édition). J'ai également trouvé Å. Méthodes numériques de Björck pour les problèmes des moindres carrés très bonne ressource à ce sujet; tandis que SVD n'est pas l'objectif principal du livre, il aide à contextualiser son utilisation.
Si je dois vous donner un conseil général à ce sujet, n'essayez pas d'écrire vos propres algorithmes SVD, sauf si vous avez déjà suivi avec succès quelques cours d'algèbre linéaire numérique et que vous savez ce que vous faites. Je sais que cela semble contre-intuitif mais vraiment, il y a une tonne de choses qui peuvent mal tourner et vous vous retrouvez avec (au mieux) des implémentations sous-optimales (sinon erronées). Il y a de très bonnes suites gratuites sur la question (par exemple. Eigen , Armadillo et Trilinos pour n'en nommer que quelques-unes.)
la source
svds
) vont jusqu'à utiliser simplement leur fonction SVD tronquée comme enveloppe pour leurseigs
routines eigendecomposition ( ) tronquées .