Ich habe die SVD von Intel MKL ( dgesvd
über SciPy) verwendet und festgestellt, dass die Ergebnisse erheblich voneinander abweichen, wenn ich die Genauigkeit zwischen float32
und float64
wenn meine Matrix schlecht konditioniert ist / nicht den vollen Rang hat. Gibt es einen Leitfaden zum Mindestmaß an Regularisierung, das ich hinzufügen sollte, um die Ergebnisse unempfindlich gegenüber float32
-> float64
Änderungen zu machen?
Insbesondere wenn ich mache , sehe ich, dass sich die L ∞ -Norm von V T X um ungefähr 1 bewegt, wenn ich die Genauigkeit zwischen und ändere . Die L 2 -Norm von A ist 10 5 und hat ungefähr 200 Null-Eigenwerte von insgesamt 784.float32
float64
Durch SVD auf mit λ = 10 - 3 verschwand der Unterschied.
numerical-analysis
stability
svd
intel-mkl
numerical-limitations
Jaroslaw Bulatow
quelle
quelle
Antworten:
Obwohl die Frage eine gute Antwort hat, ist hier eine Faustregel für kleine Singularwerte mit einer Darstellung.
Hinzugefügt: Die folgenden Zeilen berechnen diese Faustregel.
Die Hilbert-Matrix scheint als Testfall für Rundungsfehler weit verbreitet zu sein:
Hier Bits niedriger Ordnung in die Mantissen der Hilbert - Matrix werden auf Null gesetzt,
A.astype(np.float__).astype(np.float64)
und dannnp.linalg.svd
zulaufenfloat64
. (Die Ergebnisse sind beisvd
allenfloat32
ungefähr gleich.)Das einfache Abschneiden auf
float32
kann sogar nützlich sein, um hochdimensionale Daten zu entrauschen, z. B. für die Zug- / Testklassifizierung.Echte Testfälle wären willkommen.
quelle
numpy
undscipy.linalg.svd
rufen Sie LAPACK gesdd auf , siehe ParameterJOBR
indgejsv
: "Gibt den BEREICH für die Singularwerte an. Gibt die Lizenz aus, kleine positive Singularwerte auf Null zu setzen, wenn sie außerhalb liegen ..." (scipy.sparse.linalg.svds
umschließt ARPACK und hat den Parametertol
Toleranz für singuläre Werte.)float64
float32
quelle