Qual é a melhor maneira de calcular a decomposição de valor singular (SVD) de uma matriz positiva muito grande (65M x 3,4M) em que os dados são extremamente escassos?
Menos de 0,1% da matriz é diferente de zero. Eu preciso de uma maneira que:
- caberá na memória (eu sei que existem métodos online)
- será calculado em um prazo razoável: 3,4 dias
- será preciso o suficiente, no entanto, a precisão não é minha principal preocupação e eu gostaria de poder controlar a quantidade de recursos investidos nele.
Seria ótimo ter uma biblioteca Haskell, Python, C # etc. que a implementa. Eu não estou usando mathlab ou R, mas se necessário eu posso ir com R.
Respostas:
Se ele se encaixar na memória, construa uma matriz esparsa em R usando o pacote Matrix e tente irlba para o SVD. Você pode especificar quantos vetores singulares deseja no resultado, que é outra maneira de limitar o cálculo.
Essa é uma matriz bastante grande, mas tive bons resultados com esse método no passado.
irlba
é bastante state-of-the-art. Ele usa o algoritmo de bi-diagonalização Lanczos implicitamente reiniciado .Ele pode percorrer o conjunto de dados do prêmio netflix (480.189 linhas por 17.770 colunas, 100.480.507 entradas diferentes de zero) em milissegundos. Seu conjunto de dados é ~ 200.000 vezes maior que o conjunto de dados da Netflix; portanto, leva muito mais tempo que isso. Pode ser razoável esperar que ele faça o cálculo em alguns dias.
fonte
Matrix
? Tente limitar o número de valores singulares que você calcula ... talvez apenas veja o top 10?fonte