Effiziente niedrigstufige Approximation in MATLAB

8

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?

    
Victor May 09.01.2012, 16:17
quelle

2 Antworten

6

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 .

    
cyborg 09.01.2012, 22:51
quelle
5

Sie können mit Hilfe der Funktion svds schnell eine auf SVD basierende Approximation mit niedrigem Rang berechnen.

%Vor%

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:

%Vor%

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).

    
reve_etrange 10.01.2012 02:56
quelle

Tags und Links