Korzystałem z SVD Intela MKL ( dgesvd
przez SciPy) i zauważyłem, że wyniki są znacząco różne, kiedy zmieniam precyzję pomiędzy float32
i float64
kiedy moja matryca jest źle uwarunkowana / nie w pełni ustawiona. Czy istnieje przewodnik dotyczący minimalnej ilości regularyzacji, którą powinienem dodać, aby wyniki były niewrażliwe na float32
-> float64
zmianę?
W szczególności robienie , Widzę to norma przesuwa się o około 1, gdy zmieniam precyzję pomiędzy float32
i float64
. norma jest i ma około 200 zerowych wartości własnych z 784 ogółem.
Włączanie SVD z sprawiło, że różnica zniknęła.
numerical-analysis
stability
svd
intel-mkl
numerical-limitations
Jarosław Bułatow
źródło
źródło
Odpowiedzi:
Chociaż pytanie ma świetną odpowiedź, oto ogólna zasada dla małych pojedynczych wartości z fabułą.
Dodano: poniższe kilka linii oblicza tę zasadę.
Macierz Hilberta wydaje się być szeroko stosowana jako przypadek testowy dla błędu zaokrąglenia:
Tutaj bity niskiego rzędu w mantysach macierzy Hilberta są zerowane
A.astype(np.float__).astype(np.float64)
, a następnienp.linalg.svd
są wprowadzanefloat64
. (Wyniki dlasvd
wszystkichfloat32
są prawie takie same.)Po prostu obcięcie do
float32
może być nawet przydatne do odrzucania danych wielowymiarowych, np. Do klasyfikacji pociągu / testu.Prawdziwe przypadki testowe byłyby mile widziane.
źródło
numpy
iscipy.linalg.svd
wywołaj LAPACK gesdd , patrz parametrJOBR
wdgejsv
: „Określa ZAKRES dla wartości w liczbie pojedynczej. Wydaje licencję na zerowanie małych dodatnich wartości w liczbie pojedynczej, jeśli są poza ...” (scipy.sparse.linalg.svds
otacza ARPACK i ma parametrtol
Tolerancja dla pojedynczych wartości.)Dekompozycja wartości osobliwych dla macierzy symetrycznejA=AT
jest taki sam jak jego kanoniczny skład eigend (tj. z ortonormalną matrycą wektorów własnych), podczas gdy to samo dotyczy macierzy niesymetrycznej M=UΣVT jest tylko kanonicznym rozkładem wartości własnej macierzy symetrycznej
Odpowiedź brzmi zaskakująco nie. Pozwolićϵ>0 bądź mały i rozważ dwie matryce
Teraz, stosując tę wiedzę z powrotem do SVD ze skończoną precyzją, napiszmyM0=U0Σ0VT0 jako Mϵ=UϵΣϵVTϵ
jak ta sama matryca w Σ0,Σϵ
musi różnić się nie więcej niż małym stałym współczynnikiem wynoszącym ϵ≈10−7 , ale pojedyncze wektory U0,Uϵ i V0,Vϵ
może różnić się dowolnie dużą ilością. Dlatego, jak pokazano, nie ma sposobu, aby SVD była „stabilna” w sensie pojedynczych wektorów.
float64
precyzyjna matryca , orazfloat32
precyzji. Jeśli założymy, że same SVD są dokładne, to liczby osobliweźródło