Ich habe verschiedene Methoden verwendet, um sowohl den Rang einer Matrix als auch die Lösung eines Matrixgleichungssystems zu berechnen. Ich bin auf die Funktion linalg.svd gestoßen. Vergleicht man dies mit meiner eigenen Anstrengung, das System mit der Gaußschen Eliminierung zu lösen, scheint es sowohl schneller als auch präziser zu sein. Ich versuche zu verstehen, wie das möglich ist.
Soweit ich weiß, verwendet die Funktion linalg.svd einen QR-Algorithmus, um die Eigenwerte meiner Matrix zu berechnen. Ich weiß, wie das mathematisch funktioniert, aber ich weiß nicht, wie Numpy es so schnell und ohne großen Genauigkeitsverlust schafft.
Also meine Frage: Wie funktioniert die Funktion numpy.svd und wie gelingt es, dies schnell und genau zu tun (im Vergleich zur Gauß-Eliminierung)?
quelle
dgesdd
für echte SVDs. Ihre eigentliche Frage lautet also wahrscheinlich: "Wie funktioniert Lapack Dgesdd?"Antworten:
Ihre Frage enthält eine Reihe von Problemen.
Verwenden Sie nicht die Gaußsche Eliminierung (LU-Faktorisierung), um den numerischen Rang einer Matrix zu berechnen. Die LU-Faktorisierung ist für diesen Zweck in der Gleitkommaarithmetik unzuverlässig. Verwenden Sie stattdessen eine rangaufschlussreiche QR-Zerlegung (z. B.
xGEQPX
oderxGEPQY
in LAPACK, wobei x C, D, S oder Z ist, obwohl diese Routinen schwer zu finden sind; siehe die Antwort von JedBrown zu einer verwandten Frage ), oder verwenden Sie eine SVD (Singulärwertzerlegung wiexGESDD
oderxGESVD
, wobei x wieder C, D, S oder Z ist). Die SVD ist ein genauerer, zuverlässigerer Algorithmus zur Bestimmung des numerischen Ranges, erfordert jedoch mehr Gleitkommaoperationen.Für die Lösung eines linearen Systems ist die LU-Faktorisierung (mit partiellem Schwenken, die Standardimplementierung in LAPACK) in der Praxis äußerst zuverlässig. Es gibt einige pathologische Fälle, in denen die LU-Faktorisierung mit partiellem Schwenken instabil ist (siehe Vorlesung 22 in Numerical Linear Algebra)von Trefethen und Bau für Details). Die QR-Faktorisierung ist ein stabilerer numerischer Algorithmus zum Lösen linearer Systeme, weshalb Sie wahrscheinlich so genaue Ergebnisse erhalten. Es erfordert jedoch mehr Gleitkommaoperationen als eine LU-Faktorisierung um den Faktor 2 für quadratische Matrizen (ich glaube, JackPoulson kann mich diesbezüglich korrigieren). Für rechteckige Systeme ist die QR-Faktorisierung die bessere Wahl, da sie Lösungen mit den kleinsten Quadraten für überbestimmte lineare Systeme liefert. SVD kann auch zum Lösen linearer Systeme verwendet werden, ist jedoch teurer als die QR-Faktorisierung.
janneb ist richtig, dass numpy.linalg.svd ein Wrapper
xGESDD
in LAPACK ist. Singulärwertzerlegungen laufen in zwei Stufen ab. Zunächst wird die zu zersetzende Matrix in eine bidiagonale Form reduziert. Der Algorithmus, der in LAPACK zum Reduzieren auf Bidiagonalform verwendet wird, ist wahrscheinlich der Lawson-Hanson-Chan-Algorithmus und verwendet an einem Punkt die QR-Faktorisierung. Die Vorlesung 31 in Numerical Linear Algebra von Trefethen und Bau gibt einen Überblick über diesen Prozess. DannxGESDD
wird ein Teile-und-Herrsche - Algorithmus die Singulärwerte und linke und rechte Singulärvektoren aus der Bidiagonalmatrix zu berechnen. Um Hintergrundinformationen zu diesem Schritt zu erhalten, müssen Sie Matrix Computations von Golub und Van Loan oder Applied Numerical Linear Algebra von Jim Demmel konsultieren .Schließlich sollten Sie singuläre Werte nicht mit Eigenwerten verwechseln . Diese beiden Mengen sind nicht gleich. Die SVD berechnet die Singularwerte einer Matrix. Cleve Molers Numerical Computing mit MATLAB gibt einen schönen Überblick über die Unterschiede zwischen Singularwerten und Eigenwerten . Im Allgemeinen gibt es keine offensichtliche Beziehung zwischen den Singularwerten einer gegebenen Matrix und ihren Eigenwerten, außer im Fall von normalen Matrizen, bei denen die Singularwerte der Absolutwert der Eigenwerte sind.
quelle
rank
Funktion). Bei beiden Ansätzen ist auch ein gewisses Maß an Diskretion erforderlich. Beim SVD-Ansatz ist der numerische Rang die Anzahl der Singularwerte über einem festgelegten (normalerweise sehr kleinen) Grenzwert. (Der QR-Ansatz ist ähnlich, ersetzt jedoch singuläre Werte durch diagonale Einträge der R-Matrix.)Aufgrund des Wortlauts Ihrer Frage gehe ich davon aus, dass Ihre Matrix quadratisch ist. Die SVD-Routinen von LAPACK wie zgesvd verlaufen für quadratische Matrizen im Wesentlichen in drei Schritten:
quelle
numpy.linalg.svd ist ein Wrapper um {Z, D} GESDD von LAPACK. LAPACK wiederum wurde von einigen der weltweit führenden Experten für numerische lineare Algebra mit größter Sorgfalt geschrieben. Es wäre in der Tat sehr überraschend, wenn es jemandem, der mit dem Gebiet nicht vertraut ist, gelingen würde, LAPACK zu schlagen (entweder in Bezug auf Geschwindigkeit oder Genauigkeit).
Warum QR besser ist als Gaußsche Eliminierung, ist wahrscheinlich besser geeignet für /scicomp//
quelle