Schnelle Bestimmung, ob eine dichte Matrix einen niedrigen Rang hat oder nicht


13

In einem Softwareprojekt, an dem ich arbeite, sind bestimmte Berechnungen für dichte Matrizen mit niedrigem Rang erheblich einfacher. Bei einigen Problemfällen handelt es sich um dichte Matrizen mit niedrigem Rang, die mir jedoch vollständig und nicht als Faktoren zur Verfügung stehen. Daher muss ich den Rang und den Faktor der Matrix überprüfen, wenn ich die Struktur mit niedrigem Rang nutzen möchte .

Die fraglichen Matrizen sind typischerweise vollständig oder nahezu vollständig dicht, wobei n im Bereich von einhundert bis zu einigen tausend liegt. Wenn eine Matrix einen niedrigen Rang hat (sagen wir weniger als 5 bis 10), lohnt es sich, die SVD zu berechnen und sie als Faktorisierung mit niedrigem Rang zu verwenden. Wenn die Matrix jedoch nicht von niedrigem Rang ist, würde der Aufwand verschwendet.

Daher möchte ich einen schnellen und einigermaßen zuverlässigen Weg finden, um festzustellen, ob der Rang niedrig ist oder nicht, bevor ich mich um eine vollständige SVD-Faktorisierung bemühe. Wenn zu irgendeinem Zeitpunkt klar wird, dass der Rang über dem Grenzwert liegt, kann der Prozess sofort gestoppt werden. Wenn die Prozedur fälschlicherweise feststellt, dass die Matrix einen niedrigen Rang hat, wenn dies nicht der Fall ist, ist dies kein großes Problem, da ich immer noch eine vollständige SVD durchführen würde, um den niedrigen Rang zu bestätigen und eine Faktorisierung mit niedrigem Rang zu finden.

Zu den Optionen, die ich in Betracht gezogen habe, gehört ein Rang, der die LU- oder QR-Faktorisierung aufdeckt, gefolgt von einer vollständigen SVD als Überprüfung. Gibt es andere Ansätze, die ich berücksichtigen sollte?

Antworten:


8

Es gibt einen tollen Trick, den ich kürzlich aus diesem Artikel gelernt habe . Sie beginnen mit dem rangaufschlussreichen QR und hören nach den ersten Hausbesitzerreflexionen auf, wenn Sie eine Matrix der Form [ R 1 R 12 0 R 22 ] haben , wobei R 1 dreieckig mit der Größe k × k ist und R 22 normalerweise nicht dreieckig (da wir nach den ersten k Iterationen unserer Hauptschleife angehalten haben ). An dieser Stelle prüfen Sie, ob R 22ε : Wenn dies zutrifft, dann Ak

[R1R120R22],
R1k×kR22kR22εEINhöchstens von einer Matrix mit Rang k entfernt ist ; Andernfalls sollte dies nicht der Fall sein (abgesehen von numerischen Fehlern).εk

Diese Prozedur kostet für eine dichte n × n- Matrix.Ö(n2k)n×n


Dies ist im Wesentlichen der Ansatz, den ich in der Frage beschrieben habe. Ich denke, dass Wolfgang Bangerths vorgeschlagene Antwort besser sein könnte als . O(n2k)
Brian Borchers

7

Das Problem ist natürlich, dass die Berechnung des wahren Ranges (z. B. über eine QR-Zerlegung) nicht wirklich billiger ist als die Berechnung einer niedrigrangigen Darstellung der Matrix.

Das Beste, was Sie wahrscheinlich tun können, ist, einen randomisierten Algorithmus zu verwenden, um Näherungen mit niedrigem Rang zu finden. Diese können zumindest theoretisch erheblich schneller sein als die Arbeit an der gesamten Matrix, da sie im Wesentlichen nur Zerlegungen für Projektionen berechnen der Matrix auf zufällige Teilräume .

100×100


Nach dem, was ich über diese Algorithmen weiß, erzeugen sie eine Matrix mit niedrigem Rang, die in der Norm der gegebenen Matrix einigermaßen nahe kommt. Ich muss wissen, ob es eine (zum Beispiel) Rang-10-Matrix oder weniger gibt, die sehr nahe an der angegebenen Matrix liegt (sagen wir einen relativen Fehler von 1.0e-10 oder besser).
Brian Borchers

Ja, aber Sie können auch eine QR-Zerlegung der projizierten (niedrigdimensionalen) Matrix durchführen. Wenn diese Zerlegung einen Mangel an vollem Rang anzeigt, liegt auch eine rangdefiziente ursprüngliche Matrix vor. War das nicht das Kriterium, das Sie für eine QR-Zerlegung der ursprünglichen Matrix benötigen?
Wolfgang Bangerth

kkk1kAkknO(k2n)AO(kn2)

k=nkkn2n3

1

Ein weiterer Ansatz, den Sie ausprobieren sollten, ist die Verwendung der Adaptiven Kreuzapproximation (ACA). Es ist ein ziemlich beliebter Algorithmus, bei dem viele Implementierungen online verfügbar sind. Als Referenz können Sie das Originalpapier sehen:

ACA und seine Variationen (z. B. ACA +, Hybrid Cross Approximation HCA) können in verschiedenen Szenarien verwendet werden. Wenn Sie bereits die gesamte dichte Matrix berechnet haben, ist dies eine der günstigsten Möglichkeiten, da Sie Residuen bei Bedarf genau berechnen können.

O(Nr)Nr(ϵ)rϵO(N2r)


0

EIN0xEINxEINEINTEIN

(EINTEIN)EIN

from scipy.sparse.linalg import svds
sing = svds( A, k=20, tol=1e-4, return_singular_vectors=False )  # v0=random
# runtimes on random-normal n x n:
# n = 100, 1k, 2k
#       5, 130, 770 ms
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.