2012-05-23 30 views
13

Estoy haciendo una tarea de clasificación de texto con R, y obtengo una matriz de término de documento con tamaño 22490 por 120,000 (solo 4 millones de entradas distintas de cero, menos de 1% de entradas). Ahora quiero reducir la dimensionalidad utilizando PCA (análisis de componentes principales). Desafortunadamente, R no puede manejar esta gran matriz, por lo que almaceno esta matriz dispersa en un archivo en el "Formato Matrix Market", con la esperanza de utilizar algunas otras técnicas para hacer PCA.Aplicar PCA en matriz dispersa muy grande

Entonces, ¿podría alguien darme algunos consejos para las bibliotecas útiles (cualquiera que sea el lenguaje de programación), lo que podría hacer PCA con esta matriz a gran escala con facilidad, o hacer un PCA escritura a mano por mí mismo, en otras palabras, calcular el matriz de covarianza al principio, y luego calcular los valores propios y vectores propios para la matriz de covarianza.

Lo que yo quiero es calcular todos los PC (120.000), y elegir sólo los mejores PCs N, que representa el 90% de la varianza. Obviamente, en este caso, tengo que dar un umbral a priori para establecer algunos valores de varianza muy pequeños en 0 (en la matriz de covarianza); de lo contrario, la matriz de covarianza no será escasa y su tamaño sería de 120,000 por 120,000, que es imposible de manejar con una sola máquina. Además, las cargas (vectores propios) serán extremadamente grandes y deberían almacenarse en formato disperso.

Muchas gracias por cualquier ayuda!

Nota: Estoy utilizando una máquina con 24GB de RAM y 8 núcleos de CPU.

+0

No estoy seguro de si es 100% correcto, pero creo que MatLab puede hacer el trabajo. – Anton

+0

Si no le agrada esto, podría valer la pena preguntar en http://stats.stackexchange.com/ – NPE

+0

@aix Gracias por sus consejos, lo pasé a la versión beta de la ciencia computacional y obtuve algunos consejos útiles. consejos. También puede seguirlo en esta [URL] (http://scicomp.stackexchange.com/questions/2313/apply-pca-on-very-large-sparse-matrix) –

Respuesta

11

El kit de herramientas de Python scikit-learn tiene algunas variantes de PCA, de las cuales RandomizedPCA pueden manejar matrices dispersas en cualquiera de los formatos admitidos por scipy.sparse. scipy.io.mmread debería ser capaz de analizar el formato Matrix Market (aunque nunca lo intenté).

Descargo de responsabilidad: Estoy en el equipo de desarrollo de scikit-learn.

EDIT: el soporte de matriz dispersa de RandomizedPCA ha quedado obsoleto en scikit-learn 0.14. TruncatedSVD se debe utilizar en su lugar. Ver la documentación para más detalles.

+0

Muchas gracias @larmans, hasta cierto punto, su método propuesto puede hacer PCA con la matriz dispersa, pero solo puede calcular una pequeña cantidad de PC, debido al gran consumo de memoria: - ( –

+0

Tenga en cuenta que 'RandomizedPCA' ha quedado en desuso en favor de' PCA' con el argumento de palabra clave 'svd_solver = 'randomized'' – BallpointBen

6

En lugar de ejecutar PCA, puede probar Latent Dirichlet Allocation (LDA), que descompone la matriz de documento-palabra en una matriz de documento-tema y palabra-tema. Aquí hay un enlace a una implementación R: http://cran.r-project.org/web/packages/lda/ - hay bastantes implementaciones, aunque si google.

Con LDA debe especificar un número fijo de temas (similar a los componentes principales) de antemano. Una alternativa potencialmente mejor es HDP-LDA (http://www.gatsby.ucl.ac.uk/~ywteh/research/npbayes/npbayes-r21.tgz), que aprende la cantidad de temas que forman una buena representación de su corpus.

Si puede ajustar nuestro conjunto de datos en la memoria (que parece que puede), entonces tampoco debería tener problemas para ejecutar el código LDA.

Como señalaron varias personas en el foro scicomp, no debería haber necesidad de calcular todos los componentes del principio 120k. Algoritmos como http://en.wikipedia.org/wiki/Power_iteration calculan los valores propios más grandes de una matriz, y los algoritmos LDA convergerán a una representación de longitud de descripción mínima de los datos dada la cantidad de temas especificados.

Cuestiones relacionadas