¿Cuál es la mejor manera de calcular la descomposición de valores singulares (SVD) de una matriz positiva muy grande (65M x 3.4M) donde los datos son extremadamente escasos?
Menos del 0.1% de la matriz no es cero. Necesito una forma que:
- cabe en la memoria (sé que existen métodos en línea)
- se computará en un tiempo razonable: 3,4 días
- será lo suficientemente preciso, sin embargo, la precisión no es mi principal preocupación y me gustaría poder controlar la cantidad de recursos que le dedico.
Sería genial tener una biblioteca Haskell, Python, C # etc. que lo implemente. No estoy usando mathlab o R pero si es necesario puedo ir con R.
Respuestas:
Si cabe en la memoria, construya una matriz dispersa en R usando el paquete Matrix e intente irlba para la SVD. Puede especificar cuántos vectores singulares desea en el resultado, que es otra forma de limitar el cálculo.
Esa es una matriz bastante grande, pero he tenido muy buenos resultados con este método en el pasado.
irlba
es bastante vanguardista. Utiliza el algoritmo de bi-diagonalización Lanczos reiniciado implícitamente .Puede analizar el conjunto de datos de premios de netflix (480,189 filas por 17,770 columnas, 100,480,507 entradas distintas de cero) en milisegundos. Su conjunto de datos es ~ 200,000 veces más grande que el conjunto de datos de Netflix, por lo que lleva mucho más tiempo que eso. Puede ser razonable esperar que pueda hacer el cálculo en un par de días.
fuente
Matrix
? Intente limitar el número de valores singulares que calcula ... ¿tal vez solo mire los 10 principales?fuente