Ich versuche herauszufinden, ob es einen schnelleren Weg gibt, alle Eigenwerte und Eigenvektoren einer sehr großen und spärlichen Adjazenzmatrix zu berechnen, als mit scipy.sparse.linalg.eigsh Soweit ich weiß, verwendet diese Methode nur die Spärlichkeit und Symmetrieattribute der Matrix. Eine Adjazenzmatrix ist auch binär, was mich glauben lässt, dass es einen schnelleren Weg gibt, dies zu tun.
Ich habe eine zufällige 1000x1000-Adjazenzmatrix mit geringer Dichte erstellt und verschiedene Methoden auf meinem x230-Ubuntu-13.04-Laptop verglichen:
- scipy.sparse.linalg.eigs: 0,65 Sekunden
- scipy.sparse.linalg.eigsh: 0,44 Sekunden
- scipy.linalg.eig: 6,09 Sekunden
- scipy.linalg.eigh: 1,60 Sekunden
Mit den spärlichen eigs und eigsh setze ich k, die Anzahl der gewünschten Eigenwerte und Eigenvektoren, auf den Rang der Matrix.
Das Problem beginnt mit größeren Matrizen - auf einer 9000x9000-Matrix dauerte es scipy.sparse.linalg.eigsh 45 Minuten!
quelle
Antworten:
FILTLAN ist eine C ++ - Bibliothek zur Berechnung innerer Eigenwerte dünn besetzter symmetrischer Matrizen. Die Tatsache, dass es ein ganzes Paket gibt, das genau diesem Thema gewidmet ist, sollte Ihnen sagen, dass es ein ziemlich schweres Problem ist. Das Finden der größten oder kleinsten Eigenwerte einer symmetrischen Matrix kann durch Verschieben / Invertieren und Verwenden des Lanczos-Algorithmus erfolgen, die Mitte des Spektrums ist jedoch eine andere Sache. Wenn Sie dies verwenden möchten, können Sie mit SWIG ein C ++ - Programm aus Python aufrufen.
Wenn Ihr Endziel darin besteht, große Potenzen der Matrix zu berechnen, können Sie einfach Eigenvektoren berechnen, die den größten Eigenwerten entsprechen, da Sie wissen, dass die kleineren Moden weniger wichtig sind, wenn Sie große Potenzen verwenden.
Verzeihen Sie mir, wenn Ihnen dies bereits klar ist: Sie können die binäre Natur der Matrix ausnutzen, indem Sie numpy mitteilen, dass sie aus ganzen Zahlen anstelle von Gleitkommazahlen besteht, indem Sie beispielsweise verwenden
Sie können auch eine parallele, dünn besetzte, lineare Algebra-Bibliothek wie CUSP oder cuSPARSE von Python aufrufen, wenn Geschwindigkeit Ihr Anliegen ist und Sie eine NVIDIA-GPU haben.
quelle
Ich möchte die Antwort von Daniel Shapero kommentieren, aber ich habe nicht genug SE-Reputation.
Die akzeptierte Antwort verwirrt mich sehr. Ich denke, Shift-Invert-Modus kann leicht verwendet werden, um innere Eigenwerte zu berechnen. Siehe: https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html
Um die ursprüngliche Frage zu beantworten: Es ist selten der Fall, dass Sie alle Eigenwerte einer großen, dünn besetzten Matrix wollen. Normalerweise möchten Sie Extreme oder eine Gruppe von inneren Werten. In diesem Fall ist eine Hermitianische Matrix
eigsh
schneller. Für Nicht-Hermitianer müssen Sie mitgeheneigs
. Und sie sind viel schneller als numpyeig
odereigh
.quelle