Zur Modellreduktion möchte ich die linken Singularvektoren berechnen, die den - sagen wir 20 - größten Singularwerten einer Matrix , wobei und . Leider wird meine Matrix ohne Struktur dicht sein. N ≤ 10 6 k ≤ 10 3 A.
Wenn ich nur die svd
Routine aus dem numpy.linalg
Modul in Python für eine Zufallsmatrix dieser Größe aufrufe, tritt ein Speicherfehler auf. Dies ist auf die Zuordnung von für die Zerlegung . A = V S U.
Gibt es Algorithmen, die diese Gefahr vermeiden? Zum Beispiel durch Einrichten nur der Singularvektoren, die mit Singularwerten ungleich Null assoziiert sind.
Ich bin bereit, mit Rechenzeit und Genauigkeit zu handeln.
full_matrices
, die auf False gesetzt wird, damit nur die Teile ungleich Null berechnet werden. Gibt es dennoch eine Möglichkeit, die Berechnung noch weiter zu reduzieren?
numpy
Backend verwendet fortran Code, die LAPACKE_dgesvd
Routine für Standard-DVDs. Normalerweise ist Ihre Matrix jedoch C_CONTIGOUS
(überprüfen Sie mit matrix.flags
). Daher werden die Daten für die Fortran-Ausrichtung kopiert. Zusätzlich wird beim Ausführen der Lapack-Routine dgesvd eine weitere Kopie Ihrer Matrix benötigt (oder zumindest der Speicher dafür). Sie können eine Kopie entfernen, wenn Sie sicherstellen, dass die Speicherausrichtung von Anfang an im fortran-Stil erfolgt.