Was ist der schnellste Weg, um den größten Eigenwert einer allgemeinen Matrix zu berechnen?


27

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 igraphR-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.386×386

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?


Siehe meine Antwort hier: scicomp.stackexchange.com/a/1679/979 . Dies ist ein aktuelles Forschungsthema und aktuelle Methoden können besser als Lanczos. Das Problem der Berechnung von Einzelwerten entspricht dem Problem der Berechnung von Eigenwerten.
Dranxo

2
400x400 Matrix! = Groß. Was bedeutet das Größte auch, wenn "es wahrscheinlich mehrere Eigenwerte gleicher Größe geben wird"? In numpy land: linalg.eig (random.normal (size = (400,400))) dauert ungefähr eine halbe Sekunde. Ist das zu langsam
meawoppl

@meawoppl ja eine halbe sekunde ist zu langsam. Dies liegt daran, dass es Teil eines anderen Algorithmus ist, der diese Berechnung viele Male ausführt.
Macht

1
@power gotcah. Haben Sie eine Annäherung an den Eigenvektor. dh ist es wahrscheinlich ähnlich wie die letzte Lösung, oder können Sie eine fundierte Vermutung über die Struktur machen?
Meawoppl

Antworten:


14

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.


Ich muss testen, ob der größte Eigenwert größer als 1 ist. Die Genauigkeit muss nur 1e-11 betragen. Eine "typische" Matrix war bisher 386 x 386. 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.
Macht

Diese Information gehört zu Ihrer Frage - bitte bearbeiten Sie sie und fügen Sie weitere Informationen hinzu (warum sind die Eigenwerte real? Oder was bedeutet das Größte?) - siehe die Bearbeitung meiner Antwort.
Arnold Neumaier

sorry, dass ich mich nicht klar erklärt habe. Ich habe auch nicht klar erklärt, dass die Eigenwerte komplex sind. Ich teste, ob Eigenwerte eine Größenordnung von eins oder mehr haben.
Macht

1
(IA)1

1
siehe edit 2 in meiner Antwort
Arnold Neumaier

7

|λn1/λn|

λn1λn


1
was ist, wenn | λ (n - 1) | = | λ (n) | ?
Macht

@power, dann konvergiert die reguläre Power-Iteration nicht. Ich weiß nicht, wie gut die Extrapolationsmethoden zwischen den verschiedenen Eigenwerten unterscheiden, dafür müssen Sie den Artikel lesen.
Pedro

2
|λn1|=|λn|λnλn1

Haben Sie einen Verweis auf eine wissenschaftliche Arbeit oder ein Buch, das dies unterstützt? Was ist, wenn \ lambda_ {n} komplex ist?
Macht

5
Bei mehreren unterschiedlichen Eigenwerten des Maximalmoduls konvergiert die Leistungsiteration nur in Ausnahmefällen. Es oszilliert im Allgemeinen auf etwas unvorhersehbare Weise.
Arnold Neumaier

5

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.


4

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).


Ich konnte keine Literatur finden, die ausdrücklich angibt, dass die Jacobi-Davidson-Methode für eine reale, allgemeine Matrix funktioniert.
Macht

Es sei denn, jeder Artikel gibt ausdrücklich eine Einschränkung an und das Konvergenzargument stützt sich auf die Einschränkung, die keine Rolle spielt.
Deathbreath

Hier ist eine weitere Erklärung von JD. Die betrachteten Matrizen sind ganz allgemein. Es wird keine spezielle Struktur ausgenutzt und die Ergebnisse für die Hermitianischen Matrizen werden verglichen und gegenübergestellt, z. B. ist die Konvergenz für die Allgemeinen Matrizen quadratisch, für die Hermitianischen Matrizen jedoch kubisch.
Deathbreath

Danke dafür. Ich finde keinen C-Code für eine allgemeine Matrix, daher muss ich meinen eigenen schreiben. Die Links zu den Algorithmen scheinen nur für hermetische Matrizen zu sein.
Macht

1
@power Sie werden auch in der Literatur kein Ergebnis finden, das besagt, dass die Standard-QR-Implementierungen für eine reale, allgemeine Matrix konvergieren - das ist ein offenes Problem, und tatsächlich wurde vor nicht allzu langer Zeit ein Gegenbeispiel für den QR-Code in LAPACK gefunden.
Federico Poloni

2

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.


Ich werde sehen, ob ich meine Arbeit von damals finden kann. Daran habe ich vor einem Jahr gearbeitet.
Macht

0

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.


1
Danke Dan, aber: In meinen Matrizen haben einige der anderen Eigenwerte eine ähnliche (wenn nicht die gleiche) Größe wie die größte. Ist Ihre Methode ähnlich zu Power Iteration und Rayleigh Quotient Iteration? Batterson und Smillie (1990) schreiben, dass bei einigen nicht-symmetrischen Matrizen die Rayleigh-Quotient-Iteration nicht konvergiert. Batterson, S., Smillie, J (1990) "Rayleigh Quotient Iteration for Nonsymmetric Matrices", Mathematics of Computation, Bd. 55, Nr. 191, S. 169 - 178
Macht

Wenn andere Eigenwerte die gleiche Größe haben wie der größte, sind diese Werte dann nicht auch "der größte"?
ely

@EMS: Sie wären immer noch "größte Eigenwerte", aber das Vorhandensein von mehr als einem größten würde die Konvergenz immer noch zunichte machen.
Dan

Ich frage mich nur, zu welchem ​​Eigenwert es konvergieren soll. Dinge wie Rayleigh-Quotient / Power-Methode sind gemeint, wenn es einen deutlich größten Eigenwert gibt. Bei Ihrer Frage wird nach dem größten Eigenwert gefragt, aber dann scheint es, als ob dieser für Ihr Problem nicht genau definiert ist. Ich bin nur durch den Titel des Beitrags irregeführt.
ely

-1

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).


Willkommen bei SciComp! Wie die Frage besagt, funktioniert ARPACK nicht für das OP, daher ist diese Antwort nicht wirklich hilfreich.
Christian Clason

@HoangDT Diese Frage vor dem RARPACK
Macht
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.