Załóżmy, że mam gęstą macierz o rozmiarze m × n , z rozkładem SVD A = U S V ⊤ . W mogę obliczyć SVD w następujący sposób: .
R
svd(A)
Jeśli nowy -ty wiersz zostanie dodany do A , czy można obliczyć nowy rozkład SVD na podstawie starego (tj. Przy użyciu U , S i V ), bez ponownego obliczania SVD od zera?
algorithms
svd
linear-algebra
matrix-decomposition
numerics
użytkownik 1436187
źródło
źródło
rank 1 updates
. Szybkie wersje online SVD dla lekkich systemów rekomendujących marki to pierwszy dostępny dokument. Niestety nie widziałem czegoś dla SVD już zaimplementowanego w R. Aktualizacje Cholesky istnieją (updown
odMatrix
) dzięki CHOLMOD. Rzadkość macierzy naprawdę różni się od ostatecznego rozwiązania; zakładasz gęstą lub rzadką matrycę?Odpowiedzi:
Tak, można zaktualizować rozkład SVD po dodaniu jednego nowego wiersza do istniejącej macierzy.
Zasadniczo to sformułowanie problemu „ dodaj jeden do ” jest znane jako aktualizacja rangi 1 . Link MathOverflow podany przez @amoeba na temat „ skutecznych aktualizacji rozkładu drugiej wartości rozkładu własnego ” jest doskonałym pierwszym krokiem, jeśli chcesz głębiej przyjrzeć się sprawie; pierwszy artykuł zawiera jednoznaczne rozwiązanie konkretnego pytania. Aby wyjaśnić, co oznaczają ranga pierwsza i ranga druga, nie należy się mylić, jeśli nowe jest takie, że:A∗
Gdzie i v są wektorami, to nazywasz to aktualizacją pierwszego stopnia (lub zaburzeniem ). Podstawy tej aktualizacji są podyktowane formułą Shermana-Morrisona. . Jeśli zaburzenie jest więcej niż jedna ranga, tj. A ∗ = A - U V Tu v
formuła Woodbury wchodzi w grę. Jeśli zobaczysz te formuły, zauważysz, że w grę wchodzi wiele odwrotności. Nie rozwiązujesz ich bezpośrednio. Ponieważ już rozwiązałeś już wiele z ich podsystemów (tzn. Masz już obliczony rozkład), wykorzystujesz je, aby uzyskać szybsze i / lub bardziej stabilne oszacowania. (Dlatego ludzie wciąż badają tę dziedzinę.) Użyłem książki „ Statystyka obliczeniowa ” JE Gentle'a jako odniesienia; Myślę, że rozdział. 5 Numeryczna algebra liniowa zapewni prawidłowe ustawienie. (Uber-klasyk: „ Matryca algebry z perspektywy statystyki ” Harville'a niestety nie dotyka aktualizacji rang.)
Patrząc na statystyki / aplikacje, aktualizacje pierwszego stopnia są powszechne w systemach rekomendujących, ponieważ można mieć tysiące wpisów klientów i ponownie obliczyć SVD (lub dowolny dekompozycję w tym zakresie) za każdym razem, gdy rejestruje się nowy użytkownik lub nowy produkt dodany lub usunięty jest dość marnotrawny (jeśli nie nieosiągalny). Zwykle matryce systemowe rekomendujące są rzadkie, co czyni algorytmy jeszcze bardziej wydajnymi. Dostępny pierwszy artykuł to „ Szybkie wersje SVD online dla lekkich systemów rekomendujących ” autorstwa M. Branda. Przechodząc do gęstych matryc, myślę, że patrząc na dokumenty z Rozpoznawania Wzorów i Przetwarzania Obrazowania, możesz daleko posunąć się do uzyskania właściwego algorytmu. Na przykład dokumenty:
wydaje się, że wszystkie zajmują się tym samym problemem w swoim rdzeniu; nadchodzą nowe funkcje i musimy odpowiednio szybko zaktualizować naszą reprezentację . Zauważ, że macierze te nie są symetryczne ani nawet kwadratowe. Inne dzieło M. Branda również może rozwiązać ten problem (patrz artykuł „ Szybkie modyfikacje niskiego rzędu cienkiego dekompozycji wartości pojedynczej (2006) ” - to również wspomniano w linku MO podanym na początku postu.) wiele świetnych prac na ten temat, ale większość z nich ma charakter mocno matematyczny (np. praca Benaych-Georgesa i Nadakuditi na temat „ wartości i wektorów niskiej rangi zaburzeń dużych prostokątnych macierzy losowych (2012)”) i nie sądzę, aby wkrótce pomogły w znalezieniu rozwiązania. Sugeruję, abyś skupił się na literaturze dotyczącej przetwarzania obrazu.
Niestety nie spotkałem się z żadnymi implementacjami R dla procedur aktualizacji 1. Odpowiedź na „ Aktualizowalną implementację SVD w Pythonie, C lub Fortranie? ” Z Computational Science SE zawiera szereg implementacji MATLAB i C ++, które warto rozważyć. Zwykle implementacje R, Python itp. Są opakowaniami wokół implementacji C, C ++ lub FORTRAN.
źródło