Gibt es einen abgeschnittenen SVD-Algorithmus, der die Singularwerte einzeln berechnet?
Mein Problem: Ich möchte die ersten Singularwerte (und Singularvektoren) einer großen dichten Matrix berechnen , weiß aber nicht, was ein geeigneter Wert von wäre. ist groß, daher würde ich aus Effizienzgründen die vollständige SVD lieber nicht auswerten, um anschließend die kleinsten SVs abzuschneiden.
Idealerweise gibt es eine Möglichkeit, die Singularwerte seriell vom größten ( ) zum kleinsten ( ) zu berechnen . Auf diese Weise könnte ich die Berechnung nach Berechnung des ten Singularwerts einfach anhalten, wenn unter einen bestimmten Schwellenwert fällt.
Gibt es einen solchen Algorithmus (vorzugsweise mit einer Python-Implementierung)? Beim Googeln habe ich nur abgeschnittene SVD-Funktionen gefunden, die k als Parameter verwenden, sodass Sie gezwungen sind, dies a priori zu erraten.
quelle
Antworten:
Es stehen einige Optionen zur Verfügung, wenn Sie eine ungefähre Rang-k-Faktorisierung wünschen.
Eine ungefähre Faktorisierung der obigen Form kann unter Verwendung von Standardtechniken in eine Standardzerlegung wie QR oder SVD umgewandelt werden. Eine gute Übersicht finden Sie in dem Artikel von Halko, Martinsson und Tropp "Struktur mit Zufälligkeit finden: Probabilistische Algorithmen zur Konstruktion von ungefähren Matrixzerlegungen".
In Bezug auf die Software steht in scipy (scipy.linalg.interpolative) http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html eine Schnittstelle zu ID-Algorithmen zur Verfügung , über die der Benutzer angeben kann .ϵ
quelle
(Bearbeitet, weil ich die Frage zuerst falsch verstanden habe; Sie wissen bereits, dass Routinen zur Berechnung der ersten Singularwerte verfügbar sind.)k
Wenn Sie den Ansatz der Berechnung der gesamten SVD ausschließen, reduzieren sich partielle SVD-Algorithmen auf die Verwendung iterativer Methoden zur Lösung eines verwandten hermitischen Eigenwertproblems. Eine Strategie, die Sie verfolgen könnten, wäre, diese Art von Dingen selbst von Hand zu codieren und so lange nach dem größten verbleibenden ungelösten Singularwert zu suchen, bis Sie aufhören möchten, indem Sie so etwas wie eine Shift-and-Invert-Strategie verwenden. In anspruchsvollen Paketen wie SLEPc gibt es möglicherweise elegante Möglichkeiten, dies zu tun .
Eine andere Strategie wäre die folgende:
Wenn die spärliche SVD-Routine eine dünne SVD berechnet (und ich kann nicht verstehen, warum dies nicht der Fall ist), erhalten Sie mit dieser Strategie alle gewünschten Singularwerte (plus möglicherweise einige zusätzliche), da Werte unterhalb der absoluten Toleranz angezeigt werden als Null behandelt werden. In diesem Fall können Sie scipy.sparse.linalg.svds verwenden und dabei beachten , dass ein optionaler Parameter ist und Sie ihn nicht a priori angeben müssen .k
quelle