Ewentualnie od tematu tutaj, ale istnieje kilka ( jeden , dwa ) pytania związane już.
Grzebanie w literaturze (lub wyszukiwanie google za pomocą Skróconych algorytmów SVD) ujawnia wiele artykułów, które wykorzystują obcięte SVD na różne sposoby i twierdzą (frustrujące, często bez cytowania), że istnieją szybkie algorytmy do ich obliczania, ale nikt nie wydaje się wskazywać na te algorytmy.
Jedyne, co mogę znaleźć, to pojedynczy randomizowany algorytm wykorzystywany w bibliotece redSVD .
Chciałbym zobaczyć zestaw dokładnych i niedokładnych algorytmów, odpowiednich do zrozumienia, jak działają systemy (ale niekoniecznie do ich faktycznego wdrożenia!).
Czy ktoś ma dobre referencje do tego rodzaju rzeczy?
algorithms
svd
numerics
John Doucette
źródło
źródło
Odpowiedzi:
Mówiąc bardzo ogólnie, istnieją dwa podejścia do obliczania wartości własnych lub rozkładów wartości pojedynczych. Jednym z podejść jest diagonalizacja macierzy, która zasadniczo daje cały rozkład wartości własnej / liczby pojedynczej (całe spektrum wartości własnych) w tym samym czasie, patrz przegląd tutaj: Jakie są wydajne algorytmy do obliczania rozkładu wartości pojedynczej (SVD)? Alternatywą jest użycie algorytmu iteracyjnego, który daje jeden (lub kilka) wektorów własnych na raz. Iteracje można zatrzymać po obliczeniu żądanej liczby wektorów własnych.
Nie sądzę, że istnieją algorytmy iteracyjne specjalnie dla SVD. Wynika to z faktu, że można obliczyć SVD macierzy macierzy , wykonując składnię złożoną z kwadratowej symetrycznej macierzyDlatego zamiast pytać, jakie algorytmy obliczają obcięty SVD, powinieneś zapytać, jakie algorytmy iteracyjne obliczają eigendecomposition:B ( n + m ) × ( n + m ) A = ( 0 B B ⊤ 0 ) . Algorytm obcinane SVD ≈ iteracyjny algorytm eigendecomposition .n × m b ( n + m ) × ( n + m )
Najprostszy iteracyjny algorytm nazywa się iteracją mocy i jest rzeczywiście bardzo prosty:
Wszystkie bardziej złożone algorytmy są ostatecznie oparte na pomyśle iteracji mocy, ale stają się dość wyrafinowane. Niezbędną matematykę zapewniają podprzestrzenie Kryłowa . Algorytmy to iteracja Arnoldiego (dla kwadratowych macierzy niesymetrycznych), iteracja Lanczosa (dla kwadratowych macierzy symetrycznych) i ich odmiany, takie jak np. „Niejawnie zrestartowana metoda Lanczosa” i tak dalej.
Można to znaleźć np. W następujących podręcznikach:
Wszystkie rozsądne języki programowania i pakiety statystyczne (Matlab, R, Python numpy, jak go nazywacie) używają tych samych bibliotek Fortran do przeprowadzania rozkładów wartości własnych / liczby pojedynczej. Są to LAPACK i ARPACK . ARPACK to skrót od ARnoldi PACKage, a wszystko dotyczy iteracji Arnoldi / Lanczos. Np. W Matlabie istnieją dwie funkcje SVD:
svd
wykonuje pełny rozkład za pomocą LAPACK isvds
oblicza określoną liczbę pojedynczych wektorów za pomocą ARPACK i jest to właściwie tylko opakowanie dlaeigs
wywołania na macierzy „kwadratowej”.Aktualizacja
Okazuje się, że warianty algorytmu lanczos które są specjalnie dostosowane do wykonywania SVD prostokątnej matrycy bez wyraźnego skonstruowanie macierzy kwadratowej pierwszego. Centralnym terminem jest tutaj dwukieragonalizacja Lanczosa ; o ile rozumiem, jest zasadniczo sztuczka, aby wykonać wszystkie kroki iteracji Lanczosa na bezpośrednio na nigdy nie budując a tym samym oszczędzając miejsce i czas.A A Bb ZA ZA b ZA
Istnieje również biblioteka Fortran dla tych metod, nazywa się PROPACK :
Jednak PROPACK wydaje się być znacznie mniej standardowy niż ARPACK i nie jest natywnie obsługiwany w standardowych językach programowania. Jest napisany przez Rasmus Larsen, który ma dużą 90-stronicową gazetę Lanczos o długości 90 stron z 1998 r. Z częściową reortogonalizacją, co wydaje się dobrym przeglądem. Dzięki @MichaelGrant za pośrednictwem tego wątku Computational Science SE .
Wśród najnowszych prac najpopularniejszą wydaje się być Baglama i Reichel, 2005, Augmented domyślnie wznowił metody bidiagonalizacji Lanczosa , które prawdopodobnie są na zaawansowanym poziomie. Dzięki @Dougal za podanie tego linku w komentarzach.
Aktualizacja 2
Rzeczywiście istnieje zupełnie inne podejście opisane szczegółowo w artykule przeglądowym, który sam zacytowałeś: Halko i in. 2009, Znajdowanie struktury z przypadkowością: Probabilistyczne algorytmy do konstruowania przybliżonych rozkładów macierzy . Nie wiem o tym wystarczająco dużo, aby komentować.
źródło
Właśnie natknąłem się na wątek za pomocą szybkich plików SVD googlujących, więc staram się sam coś wymyślić, ale może powinieneś przyjrzeć się adaptacyjnemu przybliżeniu krzyżowemu (ACA).
Znowu zależy to od twojego problemu, czy to zadziała. W wielu przypadkach, z którymi osobiście się spotykam, ACA jest bardzo przydatnym narzędziem numerycznym.
Uwaga: chciałem napisać to jako komentarz, ale ponieważ właśnie utworzyłem to konto, nie mam wystarczającej reputacji do komentowania ... Ale publikowanie działa.
źródło
Oto technika, którą w przeszłości z powodzeniem stosowałem do obliczania obciętego SVD (w zestawie danych Netflix). Został zaczerpnięty z tego artykułu . W ustawieniu wspólnego filtrowania należy zauważyć, że brakuje większości wartości, a chodzi o to, aby je przewidzieć , więc aby użyć obciętego SVD do rozwiązania takiego problemu, należy zastosować technikę, która działa w tych warunkach. Krótki opis:
źródło