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 svdprocedurę z numpy.linalgmoduł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_matricesktó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ń?
numpyBackend używa kodu FORTRAN w LAPACKE_dgesvdrutynę 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.