Ich möchte eine niedrigrangige Näherung für eine Matrix berechnen, die unter der Frobenius-Norm optimal ist. Der einfachste Weg, dies zu tun, besteht darin, die SVD-Zerlegung der Matrix zu berechnen, die kleinsten singulären Werte auf Null zu setzen und die Matrix mit niedrigem Rang durch Multiplizieren der Faktoren zu berechnen. Gibt es eine einfache und effizientere Möglichkeit, dies in MATLAB zu tun?
Wenn Ihre Matrix spärlich ist, verwenden Sie svds
.
Angenommen, es ist nicht spärlich, aber es ist groß, können Sie zufällige Projektionen für die schnelle Annäherung mit niedrigem Rang verwenden.
Von einem Tutorial :
Eine optimale Approximation mit niedrigem Rang kann leicht unter Verwendung der SVD von A in O (mn ^ 2) berechnet werden ) . Mit Hilfe von Zufallsprojektionen zeigen wir, wie man in O (mn log (n)) eine "fast optimale" Low-Rank-Approximation erreicht.
Matlab-Code aus einem Blog :
%Vor% Merken Sie sich auch den Parameter econ
von svd
.
Sie können mit Hilfe der Funktion svds
schnell eine auf SVD basierende Approximation mit niedrigem Rang berechnen.
svds
verwendet eigs
, um eine Teilmenge der singulären Werte zu berechnen - dies ist besonders schnell für große, dünn besetzte Matrizen. Siehe die Dokumentation; Sie können die Toleranz und die maximale Anzahl der Iterationen festlegen oder kleine Einzelwerte anstelle von Großwerten berechnen.
Ich dachte svds
und eigs
könnte schneller sein als svd
und eig
für dichte Matrizen, aber dann habe ich ein Benchmarking durchgeführt. Sie sind nur für große Matrizen schneller, wenn genügend wenige Werte angefordert werden:
Mit size- n
Quadratmatrizen, k
singular / eigen Werten und Laufzeiten in Sekunden. Ich habe Steve Eddins ' timeit
file exchange' Funktion für das Benchmarking verwendet, die versucht, Overhead- und Laufzeitvariationen zu berücksichtigen.
svds
und eigs
sind schneller, wenn Sie einige Werte aus einer sehr großen Matrix möchten. Es hängt auch von den Eigenschaften der fraglichen Matrix ab ( edit svds
sollte dir eine Idee geben warum).
Tags und Links matlab linear-algebra