¿Cuál es el mejor código SVD disperso paralelo disponible públicamente?

La implementación SVD de Mahout (originalmente del descomponedor) se ejecuta en Hadoop y se escala linealmente con el número de filas de la matriz de entrada (el doble del número de nodos de Hadoop, maneja una matriz con el doble del número de filas, para un resultado de rango fijo que desee) y no tiene limitaciones de memoria con respecto a este tamaño de fila (si no tiene un clúster grande, solo tardará más en ejecutarse).

Como menciona Yura, actualmente hay un artefacto de implementación (es decir, pereza del desarrollador) que conduce a una restricción en el producto del número de columnas * rango deseado <RAM disponible (dividido por 8), porque los vectores base de Lanczos se mantienen en memoria para convertirse en vectores propios al final del día.

Para corpus de texto (tamaño de vocabulario <1MM más o menos, por ejemplo), esto significa que en hardware básico todavía puede obtener 300-400 vectores singulares bien, pero para hacer grandes gráficos grandes (wikipedia, gráficos de redes sociales, web), esto no No lo cortes.

No es difícil modificar la implementación de Mahout para almacenar los vectores básicos (densos) en el disco, y luego hacer la creación de vectores propios (el último paso de Lanczos) pieza por pieza, con solo un par de vectores en la memoria a la vez. Hay un boleto abierto de JIRA para esto (https://issues.apache.org/jira/b…), y si alguien más no llega a enviar un parche, pasaré unas horas y lo haré Real Pronto ahora

Solo necesitas seguir el rastro del estimado Jake Mannix.

El descomponedor ( http://code.google.com/p/decompo …) debe ajustarse a la factura de lo que está buscando: svd disperso, matriz demasiado grande para la memoria, paralelizable.

¡Pero no lo uses! En su lugar, use Apache Mahout ( http://lucene.apache.org/mahout/ ), un proyecto al que Mannix portó el solucionador paralelo SVD Lanczos del descomponedor.

En cuanto al acceso a Python, Mahout se ejecuta en Hadoop, por lo que podría coordinarse a través de dumbo ( http://wiki.github.com/klbostee/ …) pero no lo he probado yo mismo.

gensim ( http://nlp.fi.muni.cz/projekty/g …) es una biblioteca extremadamente rápida para la descomposición en línea de matrices dispersas más grandes que la RAM. Escrito completamente en Python, pero usa rutinas rápidas BLAS / LAPACK debajo del capó, a través de NumPy.

Contiene algoritmos para la descomposición de una pasada y de dos pasadas (dos pasadas es más rápido pero necesita ver cada observación dos veces). A menos que tenga sus datos ya distribuidos previamente en su clúster, no puede ser mucho más rápido que esto, ya que enviar la entrada en la red es en realidad más lento que procesarlo directamente.

Si sus datos * están * distribuidos previamente (en un sistema de archivos que resulta ser HDFS 🙂, el código de Jake Mannix en MAHOUT puede ser su mejor opción.