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)?
linear-algebra
python
lapack
RobVerheyen
źródło
źródło
dgesdd
Lapacka 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.Odpowiedzi:
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
xGEQPX
lubxGEPQY
w 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 jakxGESDD
lubxGESVD
, 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
xGESDD
w 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ępniexGESDD
uż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.
źródło
rank
funkcji). 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.)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:
źródło
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//
źródło