Jaki jest najlepszy sposób obliczenia dekompozycji wartości pojedynczej (SVD) bardzo dużej macierzy dodatniej (65 M x 3,4 M), w której dane są bardzo rzadkie?
Mniej niż 0,1% matrycy jest niezerowe. Potrzebuję sposobu, który:
- zmieści się w pamięci (wiem, że istnieją metody online)
- zostaną obliczone w rozsądnym czasie: 3,4 dni
- będą wystarczająco dokładne, jednak dokładność nie jest moim głównym zmartwieniem i chciałbym móc kontrolować, ile zasobów w to włożę.
Byłoby wspaniale mieć bibliotekę Haskell, Python, C # itp., Która ją implementuje. Nie używam mathlaba ani R, ale w razie potrzeby mogę użyć R.
Odpowiedzi:
Jeśli pasuje do pamięci, zbuduj rzadką macierz w R za pomocą pakietu Matrix i wypróbuj irlba dla SVD. Możesz określić, ile pojedynczych wektorów chcesz w wyniku, co jest innym sposobem ograniczenia obliczeń.
To dość duża matryca, ale w przeszłości miałem bardzo dobre wyniki z tą metodą.
irlba
jest najnowocześniejszy. Wykorzystuje domyślnie zrestartowany algorytm bi-diagonalizacji Lanczosa .Może przeszukiwać zestaw danych nagród Netflix (480 189 wierszy przez 17 770 kolumn, 100 480 507 niezerowych wpisów) w milisekundach. Twój zestaw danych jest ~ 200 000 razy większy niż zestaw danych Netflix, więc zajmuje to znacznie więcej czasu. Rozsądne może być oczekiwanie, że obliczenia te zostaną wykonane w ciągu kilku dni.
źródło
Matrix
? Spróbuj ograniczyć liczbę wyliczanych pojedynczych wartości ... może po prostu spojrzeć na 10 najlepszych?źródło