EDIT: Ich teste, ob irgendwelche Eigenwerte eine Größe von eins oder mehr haben.
Ich muss den größten absoluten Eigenwert einer großen, spärlichen, nicht symmetrischen Matrix finden.
Ich habe die R- eigen()
Funktion verwendet, die den QR-Algo von entweder EISPACK oder LAPACK verwendet, um alle Eigenwerte zu finden, und dann benutze ich abs()
, um die absoluten Werte zu erhalten. Ich muss es jedoch schneller machen.
Ich habe auch versucht, die ARPACK-Schnittstelle in igraph
R-Paket zu verwenden. Es gab jedoch einen Fehler für eine meiner Matrizen.
Die endgültige Implementierung muss von R aus zugänglich sein.
Es wird wahrscheinlich mehrere Eigenwerte gleicher Größe geben.
Hast du irgendwelche Vorschläge?
EDIT:
Genauigkeit muss nur sein 1e-11
. Eine "typische" Matrix war bisher . Ich konnte eine QR-Faktorisierung durchführen. Es ist jedoch auch möglich, viel größere zu haben. Ich fange gerade an, über den Arnoldi-Algorithmus zu lesen. Ich verstehe, dass es mit Lanczsos zusammenhängt.
EDIT2: Wenn ich mehrere Matrizen habe, die ich " teste " und ich weiß, dass es eine große Untermatrix gibt, die sich nicht ändert. Kann man es ignorieren / verwerfen?
Antworten:
Es hängt stark von der Größe Ihrer Matrix ab, im großen Maßstab auch davon, ob sie dünn ist und welche Genauigkeit Sie erreichen möchten.
Wenn Ihre Matrix zu groß ist, um eine einzelne Faktorisierung zuzulassen, und Sie eine hohe Genauigkeit benötigen, ist der Lanczsos-Algorithmus wahrscheinlich der schnellste Weg. Im unsymmetrischen Fall wird der Arnoldi-Algorithmus benötigt, der numerisch instabil ist. Daher muss eine Implementierung dies berücksichtigen (dies ist etwas umständlich zu heilen).
Wenn dies bei Ihrem Problem nicht der Fall ist, geben Sie in Ihrer Frage genauere Informationen an. Fügen Sie dann einen Kommentar zu dieser Antwort hinzu, und ich werde es aktualisieren.
Edit: [Dies war für die alte Version der Frage, die nach dem größten Eigenwert suchte.] Da Ihre Matrix klein und anscheinend dicht ist, würde ich Arnoldi-Iteration mit B = (IA) ^ {- 1} unter Verwendung einer Initiale durchführen permutierte Dreiecksfaktorisierung von IA, um eine billige Multiplikation mit B zu erhalten. (Oder berechnen Sie eine explizite Inverse, aber dies kostet das Dreifache der Faktorisierung.) Sie möchten testen, ob B einen negativen Eigenwert hat. Wenn Sie mit B anstelle von A arbeiten, werden negative Eigenwerte viel besser getrennt. Wenn es also einen gibt, sollten Sie schnell konvergieren.
Aber ich bin gespannt, woher dein Problem kommt. Nicht symmetrische Matrizen haben normalerweise komplexe Eigenwerte, so dass der größte Wert nicht einmal genau definiert ist. Sie müssen also mehr über Ihr Problem wissen, was Ihnen helfen kann, es noch schneller und / oder zuverlässiger zu lösen.
Edit2: Es ist schwierig, mit Arnoldi eine bestimmte Untergruppe von Interesse zu bekommen. Um die absolut größten Eigenwerte zuverlässig zu erhalten, führen Sie eine Subraumiteration unter Verwendung der ursprünglichen Matrix durch, wobei die Subraumgröße mit der Anzahl der Eigenwerte übereinstimmt oder diese übersteigt, deren Größe voraussichtlich nahe bei 1 oder höher liegt. Bei kleinen Matrizen ist dies langsamer als beim QR-Algorithmus, bei großen Matrizen ist es jedoch viel schneller.
quelle
quelle
In letzter Zeit wurden hierzu einige gute Untersuchungen durchgeführt. Die neuen Ansätze verwenden "randomisierte Algorithmen", die nur wenige Lesevorgänge Ihrer Matrix erfordern, um eine gute Genauigkeit für die größten Eigenwerte zu erzielen. Dies steht im Gegensatz zu Leistungsiterationen, die mehrere Matrix-Vektor-Multiplikationen erfordern, um eine hohe Genauigkeit zu erreichen.
Hier können Sie mehr über die neue Forschung lesen:
http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf
http://arxiv.org/abs/0909.4061
Dieser Code erledigt das für Sie:
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
Wenn Ihre Sprache nicht dabei ist, können Sie ganz einfach Ihre eigene zufällige SVD rollen. Es ist lediglich eine Matrixvektormultiplikation erforderlich, gefolgt von einem Aufruf einer Standard-SVD.
quelle
Hier finden Sie eine algorithmische Einführung in den Jacobi-Davidson-Algorithmus, der den maximalen Eigenwert berechnet.
In diesem Artikel werden die mathematischen Aspekte untersucht. JD erlaubt allgemeine (reelle oder komplexe) Matrizen und kann verwendet werden, um Bereiche von Eigenwerten zu berechnen.
Hier finden Sie verschiedene Bibliotheksimplementierungen JDQR und JDQZ (einschließlich einer C-Schnittstelle, zu der Sie von R aus eine Verknüpfung herstellen können sollten).
quelle
In Ihrem ursprünglichen Beitrag sagen Sie:
"Ich habe auch versucht, die ARPACK-Schnittstelle im igraph R-Paket zu verwenden. Es gab jedoch einen Fehler für eine meiner Matrizen."
Ich würde gerne mehr über den Fehler erfahren. Wenn Sie diese Matrix irgendwo öffentlich verfügbar machen können, wäre ich daran interessiert, ARPACK darauf zu testen.
Basierend auf dem, was ich oben gelesen habe, würde ich erwarten, dass ARPACK die größten (oder einige der größten) Eigenwerte einer dünn besetzten Matrix sehr gut extrahieren kann. Genauer gesagt, ich würde erwarten, dass Arnoldi-Methoden für diesen Fall gut funktionieren, und darauf basiert natürlich ARPACK.
Die langsame Konvergenz der Potenzmethode, wenn in dem interessierenden Bereich eng beabstandete Eigenwerte vorliegen, wurde oben erwähnt. Arnoldi verbessert dies, indem er mit mehreren Vektoren anstelle der Methode nach Potenz iteriert.
quelle
Es ist nicht der schnellste Weg, aber ein vernünftiger Weg ist, einfach wiederholt einen (anfänglich zufälligen) Vektor mit der Matrix zu treffen und dann alle paar Schritte zu normalisieren. Schließlich konvergiert es zum größten Eigenvektor, und der Normgewinn für einen einzelnen Schritt ist der zugehörige Eigenwert.
Dies funktioniert am besten, wenn der größte Eigenwert wesentlich größer ist als jeder andere Eigenwert. Wenn ein anderer Eigenwert nahe groß wie die größten ist, wird dies eine Weile Converge zu nehmen, und es kann schwierig sein , zu bestimmen , ob es hat konvergiert.
quelle
Das R-Paket rARPACK funktioniert bei mir. Und es scheint sehr schnell zu sein, da es sich lediglich um eine Schnittstelle für ARPACK handelt, das Standardpaket für die spärliche lineare Algebra (dh die Berechnung einiger Eigenwerte und Eigenvektoren).
quelle