W celu zmniejszenia modelu chcę obliczyć lewe wektory osobliwe związane z - powiedzmy 20 - największymi wartościami osobliwymi macierzy , gdzie N ≈ 10 6 i k ≈ 10 3 . Niestety moja matryca A będzie gęsta bez żadnej struktury.
Jeśli po prostu wywołam svd
procedurę z numpy.linalg
modułu w Pythonie dla losowej macierzy tego rozmiaru, napotkam błąd pamięci. Wynika to z podziału dla rozkładu A = V S U .
Czy istnieją jakieś algorytmy, które pozwalają uniknąć tej pułapki? Np. Przez ustawienie tylko wektorów pojedynczych powiązanych z niezerowymi wartościami pojedynczymi.
Jestem gotowy na wymianę czasu obliczeń i dokładności.
full_matrices
która może być ustawiona na False, tak aby obliczane były tylko części „niezerowe”. Niemniej jednak czy istnieje sposób na dalsze ograniczenie obliczeń?
numpy
Backend używa kodu FORTRAN w LAPACKE_dgesvd
rutynę dla standardowych SVD. Jednak zazwyczaj macierz jest C_CONTIGOUS
(sprawdź za pomocą matrix.flags
). Dlatego kopiuje dane do wyrównania fortran. Dodatkowo, podczas uruchamiania procedury lapack dgesvd potrzebna jest kolejna kopia macierzy (lub przynajmniej jej pamięć). Możesz pozbyć się jednej kopii, jeśli od samego początku upewnisz się, że wyrównanie pamięci jest w stylu fortran.