Möglicherweise nicht zum Thema hier, aber es gibt bereits mehrere ( eine , zwei ) verwandte Fragen.
Durch Stöbern in der Literatur (oder bei einer Google-Suche nach abgeschnittenen SVD-Algorithmen) tauchen viele Artikel auf , die abgeschnittene SVDs auf verschiedene Weise verwenden, und behaupten (frustrierend, oft ohne Angabe ), dass es schnelle Algorithmen gibt, um sie zu berechnen, aber niemand scheint darauf hinzudeuten, was diese Algorithmen sind.
Das einzige, was ich finden kann, ist ein einzelner randomisierter Algorithmus , der in der redSVD-Bibliothek verwendet wird .
Was ich sehen möchte, ist eine Reihe von exakten und ungenauen Algorithmen, die geeignet sind, die Funktionsweise der Systeme zu verstehen (aber nicht unbedingt, um sie tatsächlich zu implementieren!).
Hat jemand eine gute Referenz für so etwas?
quelle
Antworten:
Ganz allgemein gibt es zwei Ansätze zur Berechnung von Eigenwert- oder Singularwertzerlegungen. Ein Ansatz ist die Diagonalisierung der Matrix, die im Wesentlichen die gesamte Eigenwert- / Singulärwertzerlegung (das gesamte Eigenwertspektrum) zur gleichen Zeit ergibt. Sehen Sie hier eine Übersicht: Was sind effiziente Algorithmen zur Berechnung der Singulärwertzerlegung (SVD)? Die Alternative besteht darin, einen iterativen Algorithmus zu verwenden, der jeweils einen (oder mehrere) Eigenvektoren liefert. Iterationen können gestoppt werden, nachdem die gewünschte Anzahl von Eigenvektoren berechnet wurde.
Ich glaube nicht, dass es iterative Algorithmen speziell für SVD gibt. Dies liegt daran, dass man die SVD einer Matrix B berechnen kann, indem man eine neue Zerlegung einer quadratischen symmetrischen ( n + m ) × ( n + m ) -Matrix A = ( 0 B B ≤ 0 ) durchführt . Deshalb , anstatt zu fragen , was Algorithmen berechnen abgeschnittener SVD, sollten Sie fragen, was iterative Algorithmen berechnen Eigendekomposition: Algorithmus für abgeschnittenen SVD ≈ iterativen Algorithmus für Eigendekomposition .n × m B ( n + m ) × ( n + m )
Der einfachste iterative Algorithmus heißt Power-Iteration und ist in der Tat sehr einfach:
All die komplexeren Algorithmen basieren letztendlich auf der Idee der Power-Iteration, sind jedoch recht komplex. Notwendige Mathematik wird von Krylov-Subspaces angegeben . Die Algorithmen sind Arnoldi-Iteration (für quadratische unsymmetrische Matrizen), Lanczos-Iteration (für quadratische symmetrische Matrizen) und Variationen davon, wie z. B. "implizit neu gestartete Lanczos-Methode" und so weiter.
Dies können Sie zB in folgenden Lehrbüchern nachlesen:
Alle vernünftigen Programmiersprachen und Statistikpakete (Matlab, R, Python Numpy, wie Sie es nennen) verwenden die gleichen Fortran-Bibliotheken, um Eigen- / Singularwert-Zerlegungen durchzuführen. Dies sind LAPACK und ARPACK . ARPACK steht für ARnoldi PACKage und dreht sich alles um Arnoldi / Lanczos-Iterationen. In Matlab gibt es beispielsweise zwei Funktionen für SVD: Führt
svd
eine vollständige Zerlegung über LAPACK durch undsvds
berechnet eine bestimmte Anzahl von Singularvektoren über ARPACK. Dies ist eigentlich nur ein Wrapper für eineneigs
Aufruf auf der "quadratischen" Matrix.Aktualisieren
Es gibt auch eine Fortran-Bibliothek für diese Methoden, die PROPACK heißt :
PROPACK scheint jedoch weitaus weniger Standard zu sein als ARPACK und wird von Haus aus in Standard-Programmiersprachen nicht unterstützt. Es wurde von Rasmus Larsen geschrieben, der 1998 eine große, 90 Seiten lange Lanczos-Bidiagonalisierung mit teilweiser Reorthogonalisierung mit scheinbar gutem Überblick veröffentlicht hat. Vielen Dank an @MichaelGrant über diesen Computational Science SE-Thread .
Unter den neueren Veröffentlichungen scheint Baglama & Reichel, 2005, Augmented, implizit neu gestartete Lanczos-Bidiagonalisierungsmethoden , die wahrscheinlich auf dem neuesten Stand der Technik sind , die populärste zu sein . Vielen Dank an @Dougal für diesen Link in den Kommentaren.
Update 2
In der Tat gibt es einen völlig anderen Ansatz, den Sie in dem von Ihnen zitierten Übersichtsartikel ausführlich beschrieben haben: Halko et al. 2009, Struktur mit Zufälligkeit finden: Probabilistische Algorithmen zur Konstruktion von approximativen Matrixzerlegungen . Ich weiß nicht genug darüber, um einen Kommentar abzugeben.
quelle
Ich bin gerade über googeln-schnelle SVDs auf den Thread gestoßen, also versuche ich, die Dinge selbst herauszufinden, aber vielleicht sollten Sie sich mit adaptiver Kreuzapproximation (ACA) befassen.
Auch hier hängt es von Ihrem Problem ab, ob das funktioniert. In vielen Fällen, die mir persönlich begegnen, ist der ACA ein sehr nützliches numerisches Werkzeug.
Hinweis: Ich wollte dies als Kommentar schreiben, aber da ich gerade diesen Account erstellt habe, habe ich nicht genug Ruf für Kommentare ... Aber das Posten funktioniert.
quelle
Hier ist eine Technik, die ich in der Vergangenheit erfolgreich zum Berechnen einer abgeschnittenen SVD (im Netflix-Datensatz) verwendet habe. Es ist aus diesem Papier entnommen . Bei einer kollaborativen Filtereinstellung sollte beachtet werden, dass die meisten Werte fehlen, und der Punkt ist, sie vorherzusagen. Um also eine abgeschnittene SVD zu verwenden, um ein solches Problem zu lösen, müssen Sie eine Technik verwenden, die unter diesen Bedingungen funktioniert. Eine kurze Beschreibung:
quelle