language agnostic - sparseness - Aplicar PCA en matriz dispersa muy grande.
sparse matrix of type (4)
Estoy haciendo una tarea de clasificación de texto con R y obtengo una matriz de término de documento con un tamaño de 22490 por 120,000 (solo 4 millones de entradas distintas de cero, menos del 1%). 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 de mercado de la matriz", con la esperanza de usar algunas otras técnicas para hacer PCA.
Entonces, ¿podría alguien darme algunos consejos para bibliotecas útiles (cualquiera que sea el lenguaje de programación), que podría hacer PCA con esta matriz a gran escala con facilidad, o hacer un PCA a largo plazo por mi cuenta, en otras palabras, calcular la matriz de covarianza al principio, y luego calcule los valores propios y los vectores propios para la matriz de covarianza .
Lo que quiero es calcular todas las PC (120,000) y elegir solo las N principales, que representan el 90% de variación . 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 deben almacenarse en un formato disperso.
Muchas gracias por la ayuda !
Nota: estoy utilizando una máquina con 24 GB de RAM y 8 núcleos de CPU.
tarea de clasificación de texto
Resolví casi el mismo problema usando una técnica para PCA de matriz dispersa . Esta técnica puede manejar matriz dispersa muy grande. El resultado muestra que PCA tan simple supera a word2vec. Se propone que la simple PCA supere a la LDA.
En R big.PCA
del paquete bigpca
http://cran.r-project.org/web/packages/bigpca/bigpca.pdf hace el trabajo.
En lugar de ejecutar PCA, puede probar la asignación de direccionamiento latente (LDA), que descompone la matriz de documento-palabra en una matriz de documento-tema y tema-palabra. Aquí hay un enlace a una implementación de R: http://cran.r-project.org/web/packages/lda/ - hay muchas implementaciones por ahí, aunque si buscas en Google.
Con LDA, debe especificar un número fijo de temas (similar a los componentes principales) por adelantado. Una alternativa potencialmente mejor es HDP-LDA ( http://www.gatsby.ucl.ac.uk/~ywteh/research/npbayes/npbayes-r21.tgz ), que aprende el número de temas que forman una buena representación de su cuerpo.
Si puede guardar nuestro conjunto de datos en la memoria (lo que parece que puede), entonces tampoco debería tener un problema al ejecutar el código LDA.
Como señalaron varias personas en el foro de scicomp, no debería haber necesidad de computar todos los componentes del principio de 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 en una representación de longitud mínima de descripción de los datos, dada la cantidad de temas especificados.
El kit de herramientas de Python scikit-learn tiene algunas variantes de PCA, de las cuales RandomizedPCA
puede manejar matrices dispersas en cualquiera de los formatos admitidos por scipy.sparse
. scipy.io.mmread
debería poder analizar el formato de Matrix Market (aunque nunca lo probé).
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
debe utilizarse en su lugar. Consulte la documentación para más detalles.