Zrozumienie, jak Numpy robi SVD

13

Stosowałem różne metody do obliczania zarówno rangi macierzy, jak i rozwiązania układu równań macierzowych. Natknąłem się na funkcję linalg.svd. Porównując to do własnych wysiłków związanych z rozwiązaniem systemu z eliminacją Gaussa, wydaje się on zarówno szybszy, jak i bardziej precyzyjny. Próbuję zrozumieć, jak to jest możliwe.

O ile mi wiadomo, funkcja linalg.svd wykorzystuje algorytm QR do obliczania wartości własnych mojej macierzy. Wiem, jak to działa matematycznie, ale nie wiem, jak Numpy udało się to zrobić tak szybko i bez utraty precyzji.

Więc moje pytanie: jak działa funkcja numpy.svd, a dokładniej, w jaki sposób potrafi to zrobić szybko i dokładnie (w porównaniu z eliminacją gaussa)?

RobVerheyen
źródło
2
numpy używa procedury dgesddLapacka w przypadku SVD o wartościach rzeczywistych. Tak więc twoje prawdziwe pytanie brzmi prawdopodobnie: „jak działa Lapack dgesdd?”, I to jest dość nie na temat przepełnienia stosu.
talonmies,
Jeśli jesteś NAPRAWDĘ ciekawy, sugerowałbym zbadanie źródła LAPACK.
Dziękuję za komentarze i przepraszam, że jestem nie na temat.
RobVerheyen
Ten post jest postem z przepełnienia stosu . Zazwyczaj odradza się zamieszczanie postów w witrynach Stack Exchange. Standardowym protokołem ponownego przesłania pytania na innej stronie jest zamknięcie, usunięcie lub migracja oryginalnego postu przed próbą ponownego opublikowania na innej stronie. (Jeśli
migrujesz
Przepraszam, nie wiedziałem o protokole. Mam nadzieję, że wciąż mogę uzyskać odpowiedź.
RobVerheyen

Odpowiedzi:

15

W twoim pytaniu jest wiele problemów.

Nie używaj eliminacji Gaussa (faktoryzacja LU), aby obliczyć liczbową pozycję macierzy. Faktoryzacja LU jest w tym celu zawodna w arytmetyki zmiennoprzecinkowej. Zamiast tego zastosuj rozkład QR ujawniający rangę (taki jak xGEQPXlub xGEPQYw LAPACK, gdzie x to C, D, S lub Z, chociaż te procedury są trudne do wyśledzenia; zobacz odpowiedź JedBrown na powiązane pytanie ) lub użyj SVD (rozkład wartości w liczbie pojedynczej, taki jak xGESDDlub xGESVD, gdzie x oznacza ponownie C, D, S lub Z). SVD jest bardziej dokładnym, niezawodnym algorytmem do określania rangi numerycznej, ale wymaga większej liczby operacji zmiennoprzecinkowych.

Jednak w przypadku rozwiązania układu liniowego faktoryzacja LU (z częściowym obrotem, co jest standardową implementacją w LAPACK) jest wyjątkowo niezawodna w praktyce. Istnieją pewne przypadki patologiczne, w których rozkład na czynniki pierwsze z częściowym przestawieniem jest niestabilny (patrz Wykład 22 w Numerycznej algebrze liniowej)Trefethen i Bau w celu uzyskania szczegółowych informacji). Faktoryzacja QR jest bardziej stabilnym algorytmem numerycznym do rozwiązywania układów liniowych i prawdopodobnie dlatego daje tak precyzyjne wyniki. Wymaga to jednak więcej operacji zmiennoprzecinkowych niż faktoryzacja LU o współczynnik 2 dla macierzy kwadratowych (wierzę; JackPoulson może mnie w tym poprawić). W przypadku systemów prostokątnych lepszym wyborem jest faktoryzacja QR, ponieważ pozwoli ona uzyskać rozwiązania najmniejszych kwadratów w przypadku przesadnie określonych systemów liniowych. SVD może być również stosowany do rozwiązywania układów liniowych, ale będzie droższy niż faktoryzacja QR.

janneb ma rację, że numpy.linalg.svd jest opakowaniem xGESDDw LAPACK. Rozkłady poszczególnych wartości przebiegają w dwóch etapach. Po pierwsze, matryca, która ma zostać rozłożona, jest redukowana do postaci dwu- kątnej. Algorytmem zastosowanym w LAPACK jest redukcja do postaci dwukierunkowej, prawdopodobnie jest to algorytm Lawsona-Hansona-Chana, który w pewnym momencie wykorzystuje faktoryzację QR. Wykład 31 w Numerycznej algebrze liniowej autorstwa Trefethena i Baua zawiera przegląd tego procesu. Następnie xGESDDużywa algorytmu dziel i zwyciężaj, aby obliczyć wartości osobliwe oraz lewe i prawe wektory osobliwe na podstawie macierzy dwukierunkowej. Aby uzyskać informacje na temat tego kroku, musisz skonsultować obliczenia macierzowe Goluba i Van Loana lub stosowaną numeryczną algebrę liniową autorstwa Jima Demmela.

Wreszcie, nie należy mylić wartości pojedynczych z wartościami własnymi . Te dwa zestawy wielkości nie są takie same. SVD oblicza pojedyncze wartości macierzy. Obliczenia numeryczne Cleve Moler za pomocą MATLAB dają ładny przegląd różnic między wartościami osobliwymi a wartościami własnymi . Zasadniczo nie ma oczywistej zależności między wartościami osobliwymi danej macierzy a jej wartościami własnymi, z wyjątkiem macierzy normalnych , gdzie wartości osobliwe są wartością bezwzględną wartości własnych.

Geoff Oxberry
źródło
Myślę, że „niezwiązany” jest dość silny, jeśli chodzi o związek między wartościami własnymi a wartościami osobliwymi. Związek jest dość niejasny, chyba że znasz pełny rozkład matrycy Jordana, ale możesz użyć jednego, aby uzyskać oszacowanie drugiego, jeśli masz informacje (lub jesteś skłonny poczynić przypuszczenia) na temat wspomnianego rozkładu Jordana.
Dan
Co zasugerowałbyś zamiast tego?
Geoff Oxberry
Przede wszystkim dziękuję za misterną odpowiedź. Dowiedziałem się, że nie mogę użyć dekompozycji LU do ustalenia rangi matrycowej. Twoja odpowiedź wydaje się sugerować, że faktoryzacja QR byłaby w rzeczywistości szybszą metodą rozwiązania mojego problemu, prawda? Czy korzystanie z SVD ma wyraźną przewagę? Byłem w pełni świadomy faktu, że pojedyncze wartości nie są wartościami własnymi. Miałem na myśli fakt, że wartości osobliwe można obliczyć jako wartości własne macierzy pomnożone przez jej transpozycję od lewej. Przepraszam, że nie było jasne.
RobVerheyen,
Mógłbym dodać, że macierz, którą rozwiązuję, jest w rzeczywistości pojedyncza. W rzeczywistości stopień macierzy wynosi tylko około połowy rozmiaru matrycy. Być może czyni to jakąś metodę bardziej preferowaną?
RobVerheyen,
1
@RobVerheyen: QR będzie wolniejszy niż LU, ale znacznie dokładniejszy. SVD będzie nawet wolniejsze niż QR, ale SVD jest uważana za najbardziej niezawodną metodę określania rangi numerycznej (na przykład MATLAB używa SVD w swojej rankfunkcji). W przypadku każdego z tych podejść wymagana jest pewna dyskrecja; w podejściu SVD ranga liczbowa jest liczbą pojedynczych wartości powyżej określonej (zwykle bardzo małej) wartości granicznej. (Podejście QR jest podobne, ale zastępuje pojedyncze wartości diagonalnymi wpisami macierzy R.)
Geoff Oxberry
8

Ze względu na brzmienie twojego pytania zakładam, że macierz jest kwadratowa. Procedury SVD LAPACK, takie jak zgesvd , zasadniczo przebiegają w trzech etapach dla macierzy kwadratowych:

  1. obliczanie macierzy jednostkowych i , jako przekształceń Householdera, tak że ogólna macierz jest zredukowana do rzeczywistej, górnej macierzy dwukierunkowej . Po wyjściu z tego podprogramu wektory Householdera (znormalizowane tak, że ich pierwszy wpis jest domyślnie jeden) dla i są odpowiednio przechowywane w częściach poniżej i na prawo od głównej i super-przekątnej. Ten krok wymaga pracy .UAVAAB:=UAHAVAUAVABO(n3)
  2. Odmiana algorytmu do obliczania rozkładu wartości własnej rzeczywistej symetrycznej macierzy tridiagonalnej jest wykorzystywana do obliczania dwuwymiarowego SVD. Chociaż najbardziej znany algorytm dla prawdziwych symetryczny tridiagonal EVP'S (MWSZ) nie jest jeszcze, według mojej wiedzy, stabilne dla bidiagonal SVD, znajduje się interesująca dyskusja tutaj . LAPACK obecnie używa dziel i rządź podejścia do bidiagonal SVD. W bidiagonal wydajności SVD tak, że . Ten krok będzie wymagał pracy gdy MRRR jest stabilny dla SVD, ale obecnie wymaga tyle samo pracy .{UB,VB,Σ}B=UBΣVBHO(n2)O(n3)
  3. Ten krok jest trywialny. Ponieważ , , aby SVD można było jawnie utworzyć po zastosowaniu transformacji Householdera, które domyślnie definiują i dla i . Ten krok wymagał pracy .A = ( U A U B ) Σ ( V A V B ) H U A V A U B V B O ( n 3 )UABVAH=AA=(UAUB)Σ(VAVB)HUAVAUBVBO(n3)
Jack Poulson
źródło
7

numpy.linalg.svd to opakowanie wokół {Z, D} GESDD z LAPACK. Z kolei LAPACK jest bardzo starannie napisany przez czołowych światowych ekspertów w dziedzinie numerycznej algebry liniowej. Rzeczywiście, byłoby bardzo zaskakujące, gdyby komuś niezbyt dobrze zaznajomionemu z polem udało się pokonać LAPACK (pod względem szybkości lub dokładności).

Jeśli chodzi o to, dlaczego QR jest lepszy niż eliminacja Gaussa, jest to prawdopodobnie bardziej odpowiednie dla /scicomp//

janneb
źródło
Dziękuję za odpowiedź i odniesienie. Spróbuję tam.
RobVerheyen