Jak obliczyć SVD ogromnej rzadkiej macierzy?


26

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.


3
Ile masz pamięci? 0,1% z 65 mln * 3,4 mln to wciąż niezerowe wartości 221e9. Jeśli używasz 4 bajtów na wartość, to wciąż więcej niż 55 GB przy założeniu braku obciążenia, więc rzadkość nadal nie rozwiązuje problemu ... Czy musisz załadować cały zestaw na raz?
Bitwise

Powinienem był być bardziej precyzyjny. Nie więcej niż 250-500 MB z 32-bitową liczbą całkowitą. Prawdopodobnie znacznie mniej, ale wymiar jest problemem, jak go rozumiem. Mam maszynę 16 GB.
Sonia

Co powiesz na to? quora.com/…
Bitwise

Ta strona prowadzi do biblioteki Pythona, która implementuje „szybki, przyrostowy algorytm SVD o małej pamięci i dużej matrycy”: en.wikipedia.org/wiki/Latent_semantic_analysis
Bitwise

Odpowiedzi:


21

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ą. irlbajest 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.


matryca danych pasuje do pamięci, czy irlba poradzi sobie z rozkładem również w sposób efektywny pod względem pamięci?
Sonia

@Sonia: irlba jest bardzo wydajna pod względem pamięci: oblicza przybliżone rozwiązanie, można ograniczyć liczbę pojedynczych wektorów i została zaprojektowana do pracy na rzadkich macierzach. O ile mi wiadomo, jest to tak szybkie, jak to możliwe do obliczania częściowych SVD.
Zach

@Sonia: Powodzenia!
Zach

Wypróbowałem pamięć ... Przed uruchomieniem obliczę formę bloku trójkąta.
Sonia,

@Sonia, czy masz to zapisane jako rzadkie Matrix? Spróbuj ograniczyć liczbę wyliczanych pojedynczych wartości ... może po prostu spojrzeć na 10 najlepszych?
Zach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.