Python Eigenvektoren: Unterschiede zwischen numpy.linalg, scipy.linalg und scipy.spärlich.linalg
Scipy und Numpy zwischen Ihnen drei unterschiedliche Funktionen für die Suche nach Eigenvektoren für eine gegebene quadratische matrix, diese sind:
Speziell auf die situation, dass alle optionalen Argumente, die ich habe aufgehört, die letzten beiden sind Links auf Ihre Standardwerte und, dass a
/A
ist reellwertige, ich bin gespannt auf die Unterschiede zwischen diesen drei, die mehrdeutig sind aus der Dokumentation - vor allem:
- Warum nicht (3) haben Sie einen Hinweis, dass es nicht finden können alle Eigenvektoren?
- Warum muss die anderen beiden berechnen Sie alle Lösungen - warum nicht nehmen Sie eine
k
argument? - (1) hat eine Anmerkung zu sagen, dass die Eigenwerte zurückgegeben werden, in keiner bestimmten Reihenfolge; (3) hat ein optionales argument, das zur Steuerung der Reihenfolge. Hat (2) eine Garantie dazu?
- Hat (3) davon ausgehen, dass
A
spärlich ist? (mathematisch gesprochen, anstatt vertreten als scipy sparse matrix) Kann es unwirtschaftlich sein, oder geben sogar falsche Ergebnisse, wenn diese Annahme nicht zu halten? - Gibt es andere Faktoren, die ich berücksichtigen sollten, wenn die Wahl zwischen diesen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem besonderen Verhalten des Dritten zu tun hat mit der Die Lanczos-Algorithmus, die funktioniert sehr gut mit sparse-Matrizen. Die Dokumentation der
scipy.sparse.linalg.eig
sagt, es verwendet einen wrapper für die ARPACK, die wiederum verwendet, "die Implizit Restarted Arnoldi Methode (IRAM) oder, im Fall von symmetrischen Matrizen, die entsprechende Variante des Lanczos-Algorithmus." (1).Nun, der Lanczos-Algorithmus hat die Eigenschaft, dass es funktioniert besser für große Eigenwerte (in der Tat, es verwendet die maximale Eigenwert):
So, in der Erwägung, dass der Lanczos-Algorithmus ist nur eine Näherung, ich denke, die anderen zwei Methoden verwenden algos zu finden, die genaue Eigenwerte -- und scheinbar alle von Ihnen, die wahrscheinlich hängt von den verwendeten algorithmen, zu.
Hier ist eine Antwort, die nicht-routine-spezifischen Teil Ihrer Frage:
Im Prinzip der NumPy und SciPy
linalg()
Routinen sollten gleich sein. Beide verwenden LAPACK-und BLAS-Routinen intern. Die Umsetzung in `scipy.sparse` verwendet einen speziellen Algorithmus, der funktioniert gut für sparse-Matrizen (dh. ein Matrizen mit meist null-Einträge). Verwenden Sie nicht dieses, wenn Sie Ihre matrix ist dicht.Beachten Sie, dass technisch gesehen, die
eig()
in SciPy/NumPy werden verschiedene Implementierungen aufgrund der Tatsache, dass beide Pakete gebaut werden kann, mit verschiedenen Implementierungen der Lapack/BLAS. Gemeinsame Entscheidungen wäre hier standard Lapack/BLAS wie Sie bei Netzwerkbibliothek, ATLAS, Intel MKL oder OpenBLAS.