EDIT: Je teste si des valeurs propres ont une magnitude de un ou plus.
J'ai besoin de trouver la plus grande valeur propre absolue d'une grande matrice clairsemée et non symétrique.
J'ai utilisé la eigen()
fonction de R , qui utilise l'algo QR d'EISPACK ou de LAPACK pour trouver toutes les valeurs propres, puis j'utilise abs()
pour obtenir les valeurs absolues. Cependant, je dois le faire plus rapidement.
J'ai également essayé d'utiliser l'interface ARPACK dans le igraph
package R. Cependant, cela a donné une erreur pour l'une de mes matrices.
L'implémentation finale doit être accessible depuis R.
Il y aura probablement plusieurs valeurs propres de même ampleur.
Avez-vous des suggestions?
EDIT: La
précision doit seulement être 1e-11
. Une matrice "typique" a jusqu'à présent été . J'ai pu y faire une factorisation QR. Cependant, il est également possible d'en avoir de plus grandes. Je commence actuellement à lire sur l'algorithme Arnoldi. Je comprends que cela est lié à Lanczsos.
EDIT2: Si j'ai plusieurs matrices que je "teste" et que je sais qu'il existe une grande sous-matrice qui ne varie pas. Est-il possible de l'ignorer / de la rejeter?
Réponses:
Cela dépend beaucoup de la taille de votre matrice, dans le cas à grande échelle également de sa rareté et de la précision que vous souhaitez atteindre.
Si votre matrice est trop grande pour permettre une factorisation unique et que vous avez besoin d'une grande précision, l'algorithme de Lanczsos est probablement le moyen le plus rapide. Dans le cas non symétrique, l'algorithme Arnoldi est nécessaire, ce qui est numériquement instable, donc une implémentation doit y remédier (est quelque peu difficile à guérir).
Si ce n'est pas le cas dans votre problème, donnez des informations plus précises dans votre question. Ajoutez ensuite un commentaire à cette réponse et je la mettrai à jour.
Edit: [C'était pour l'ancienne version de la question, demandant la plus grande valeur propre.] Comme votre matrice est petite et apparemment dense, je ferais une itération Arnoldi sur B = (IA) ^ {- 1}, en utilisant une initiale la factorisation triangulaire permutée de IA pour avoir une multiplication bon marché par B. (Ou calculer un inverse explicite, mais cela coûte 3 fois plus que la factorisation.) Vous voulez tester si B a une valeur propre négative. En travaillant avec B à la place de A, les valeurs propres négatives sont bien mieux séparées, donc s'il y en a une, vous devriez converger rapidement.
Mais je suis curieux de savoir d'où vient votre problème. Les matrices non symétriques ont généralement des valeurs propres complexes, donc `` plus grandes '' ne sont même pas bien définies. Ainsi, vous devez en savoir plus sur votre problème, ce qui pourrait aider à suggérer comment le résoudre encore plus rapidement et / ou de manière plus fiable.
Edit2: Il est difficile d'obtenir avec Arnoldi un sous-ensemble particulier d'intérêt. Pour obtenir de manière fiable les valeurs propres absolument les plus grandes, vous devez effectuer une itération de sous-espace en utilisant la matrice d'origine, avec une taille de sous-espace correspondant ou dépassant le nombre de valeurs propres censées être proches de 1 ou plus. Sur les petites matrices, cela sera plus lent que l'algorithme QR mais sur les grandes matrices, ce sera beaucoup plus rapide.
la source
la source
Il y a eu récemment de bonnes recherches à ce sujet. Les nouvelles approches utilisent des «algorithmes randomisés» qui ne nécessitent que quelques lectures de votre matrice pour obtenir une bonne précision sur les plus grandes valeurs propres. Cela contraste avec les itérations de puissance qui nécessitent plusieurs multiplications matrice-vecteur pour atteindre une grande précision.
Vous pouvez en savoir plus sur la nouvelle recherche ici:
http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf
http://arxiv.org/abs/0909.4061
Ce code le fera pour vous:
http://cims.nyu.edu/~tygert/software.html
https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m
http://code.google.com/p/redsvd/
https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html
Si la langue de votre choix n'est pas là, vous pouvez rouler votre propre SVD aléatoire assez facilement; il ne nécessite qu'une multiplication vectorielle matricielle suivie d'un appel à un SVD standard.
la source
Ici , vous trouverez une introduction algorithmique à l'algorithme Jacobi-Davidson, qui calcule la valeur propre maximale.
Dans cet article, les aspects mathématiques sont explorés. JD permet des matrices générales (réelles ou complexes) et peut être utilisé pour calculer des plages de valeurs propres.
Ici vous pouvez trouver diverses implémentations de bibliothèque JDQR et JDQZ (y compris une interface C, à laquelle vous devriez être capable de lier à partir de R).
la source
Dans votre message d'origine, vous dites:
"J'ai également essayé d'utiliser l'interface ARPACK dans le package igraph R. Cependant, cela a donné une erreur pour l'une de mes matrices."
Je serais intéressé d'en savoir plus sur l'erreur. Si vous pouvez rendre cette matrice accessible au public quelque part, je serais intéressé à essayer ARPACK dessus.
Sur la base de ce que j'ai lu ci-dessus, je m'attendrais à ce qu'ARPACK fasse un très bon travail d'extraction des valeurs propres les plus grandes (ou quelques-unes des plus grandes) d'une matrice clairsemée. Pour être plus précis, je m'attendrais à ce que les méthodes Arnoldi fonctionnent bien dans ce cas et c'est, bien sûr, sur quoi ARPACK est basé.
La convergence lente de la méthode de la puissance lorsqu'il existe des valeurs propres étroitement espacées dans la région d'intérêt a été mentionnée ci-dessus. Arnoldi améliore cela en itérant avec plusieurs vecteurs au lieu de la méthode de l'un en puissance.
la source
Ce n'est pas le moyen le plus rapide , mais un moyen assez rapide consiste à frapper plusieurs fois un vecteur (initialement aléatoire) avec la matrice, puis à normaliser toutes les quelques étapes. Finalement, il convergera vers le plus grand vecteur propre, et le gain de norme pour une seule étape est la valeur propre associée.
Cela fonctionne mieux lorsque la plus grande valeur propre est sensiblement plus grande que toute autre valeur propre. Si une autre valeur propre est d'une amplitude proche de la plus grande, la convergence prendra un certain temps et il peut être difficile de déterminer si elle a convergé.
la source
Le package R rARPACK fonctionne pour moi. Et il semble être très rapide car ce n'est qu'une interface pour ARPACK, le package standard pour l'algèbre linéaire clairsemée (ce qui signifie calculer quelques valeurs propres et vecteurs propres).
la source