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, dieLAPACKE_dgesvd
Routine für Standard-DVDs. Normalerweise ist Ihre Matrix jedochC_CONTIGOUS
(überprüfen Sie mitmatrix.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.Antworten:
Wenn Sie nur einige einzelne Werte / Vektoren möchten, sollte ARPACK den Trick ausführen . Die SVD-Dokumente sind nicht besonders gut und diese Distribution ist aktueller.
BEARBEITEN: Wenn Sie dies in Python tun möchten, verfügt SciPy über einen Wrapper . Da Ihre Matrix dicht ist, können Sie das BSR-Format ( Block Sparse Row ) ausprobieren .
quelle
Schauen Sie sich sklearn.decomposition.TruncatedSVD in scikit-learn 0.14 -rc an.
(Ich glaube, dass die Leute, die Scikit lernen, stackoverflow.com/questions/tagged/scikit-learn folgen , also würde ich dort detaillierte Fragen stellen.)
(Wie viel Speicher haben Sie? 10 verdoppelt ist bereits 8G.)6+3
quelle
Vielleicht kannst du das versuchen.
https://github.com/jakevdp/pypropack
Dies ist ein Python-Wrapper für das PROPACK-Paket, der effiziente partielle Singularwertzerlegungen großer, dünn besetzter Matrizen und linearer Operatoren implementiert.
quelle
Intel MKL implementiert den neuen Jacobi-SVD-Algorithmus. Hier sind die Implementierungsdetails: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf
Und die LAPACK-Routine: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1
Die Arbeitsgröße ist natürlich einstellbar. Sie können C-Funktionen von Python aus problemlos mit Cython, SWIG oder einem anderen Wrapping-Mechanismus aufrufen.
quelle