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 wLAPACKE_dgesvd
rutynę dla standardowych SVD. Jednak zazwyczaj macierz jestC_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.Odpowiedzi:
Jeśli chcesz tylko kilka pojedynczych wartości / wektorów, ARPACK powinien załatwić sprawę . Dokumenty SVD nie są świetne, a ta dystrybucja jest bardziej aktualna.
EDYCJA: Jeśli chcesz to zrobić w Pythonie, SciPy ma opakowanie . Ponieważ macierz jest gęsta, możesz wypróbować format bloku rzadkich wierszy (BSR).
źródło
Spójrz na sklearn.decomposition.TruncatedSVD w scikit-learn 0.14-rc.
(Wierzę, że ludzie uczący się dzięki scikit śledzą stackoverflow.com/questions/tagged/scikit-learn , więc zadam tam szczegółowe pytania).
źródło
Może możesz tego spróbować.
https://github.com/jakevdp/pypropack
Jest to opakowanie Pythona dla pakietu PROPACK, który implementuje efektywne dekompozycje częściowej liczby pojedynczej dużych rzadkich macierzy i operatorów liniowych.
źródło
Intel MKL implementuje nowy algorytm Jacobi-SVD. Oto szczegóły implementacji: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf
I procedura LAPACK: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1
Rozmiar pracy jest oczywiście regulowany. Możesz łatwo wywoływać funkcje C z Pythona za pomocą Cython, SWIG lub dowolnego innego mechanizmu owijania.
źródło