Der Schnellste Weg zur Berechnung der Eigenwerte großer Matrizen
Ich bis jetzt verwendet numpy.linalg.eigvals zur Berechnung der Eigenwerte von quadratischen Matrizen mit mindestens 1000 Zeilen/Spalten, und in den meisten Fällen, über ein Fünftel der Einträge, die nicht null ist (ich weiß nicht, ob das in Betracht gezogen werden ein sparse matrix). Ich fand einen anderen Thema darauf hinweist, dass scipy können möglicherweise einen besseren job machen.
Da ich jedoch zur Berechnung der Eigenwerte für Hunderte von tausenden von großen Matrizen Zunehmender Größe (möglicherweise bis zu 20000 Zeilen/Spalten, und ja, ich brauche ALLE Ihre Eigenwerte), das wird immer schrecklich lange. Wenn ich kann die Dinge beschleunigen, auch nur das kleinste bisschen, wäre es wahrscheinlich die Mühe Wert sein.
Also meine Frage ist: gibt es einen schnelleren Weg zur Berechnung der Eigenwerte, wenn nicht, beschränke mich auf python?
- Wenn python ist nicht unbedingt ein muss, dann ist jede andere Low-level-Sprache (C++ oder auch C#) geben Sie einen Geschwindigkeitsschub. Nur Frage der geeigneten Umsetzung.
- Was auch immer Sie tun, Bedenken Sie, dass eine Menge
numpy
ist ein Python-freundlich wrapper-Funktionen geschrieben, die in Sprachen wie C, Fortran, assembler. Ich sehe aus den docs, dienumpy.linalg.eigvals
ich eine wrapper-Funktionen in der LINPACK-Bibliothek. Dies bedeutet nicht, dass Sie nicht finden können, schneller Löser, aber Sie müssen möglicherweise ein Blick über numpy, scipy und LAPACK um Sie zu finden. - Verwenden Sie eine iterative Methoden ? Wenn ja, vielleicht kannst du parallelise Sie ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
@HighPerformanceMark richtig in den Kommentaren, dass die algorithmen hinter numpy (LAPACK und dergleichen) sind einige der besten, vielleicht aber auch nicht Stand der Technik, numerische algorithmen für diagonalizing vollen Matrizen. Sie können jedoch wesentlich Dinge beschleunigen, wenn Sie haben:
Sparse-Matrizen
Wenn die matrix nur eine geringe Dichte, d.h. die Anzahl der Einträge gefüllt ist k, ist, so dass
k<<N**2
dann sollten Sie schauen,scipy.lichten
.Banded matrices
Gibt es zahlreiche algorithmen für das arbeiten mit Matrizen von einer bestimmten gebänderte Struktur.
Überprüfen Sie heraus die Löser in
scipy.linalg.lösen.gebänderte
.Größten Eigenwerte
Meisten der Zeit, die Sie nicht wirklich müssen alle Eigenwerte. In der Tat, die meisten der physikalischen information stammt aus dem größten Eigenwerte und der rest sind einfach hochfrequenten Schwingungen, die sind nur vorübergehend. In diesem Fall sollten Sie schauen in die Eigenwert-Lösungen, die schnell konvergieren, um diese größten Eigenwerte/- Vektoren wie die Die Lanczos-Algorithmus.
Einen einfachen Weg, um vielleicht eine anständige Beschleunigung, ohne code-änderungen (vor allem auf einem many-core-Maschine) ist die Verknüpfung von numpy, um eine schnellere lineare algebra-Bibliothek, wie MKL, ACML, oder OpenBLAS. Wenn Sie im Zusammenhang mit einer akademischen institution, die ausgezeichnete Anaconda python-distribution damit Sie problemlos link zu MKL kostenfrei; ansonsten können Sie berappen $30 (in welchem Fall Sie sollten versuchen, die 30-Tage-Testversion der Optimierungen erste) oder do it yourself (leicht ärgerlich Prozess, aber es ist definitiv machbar).
Ich würde auf jeden Fall versuchen eine spärliche Eigenwert solver ebenfalls, obwohl.