Aplique PCA en una matriz dispersa muy grande

16

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

Entonces, ¿alguien podría darme algunas sugerencias para bibliotecas útiles (cualquiera que sea el lenguaje de programación), que podrían hacer PCA con esta matriz a gran escala con facilidad, o hacer un PCA de larga data por mí mismo, 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 mejores PC N, que representan una variación del 90% . Obviamente, en este caso, tengo que dar un umbral a priori para establecer algunos valores de varianza muy pequeños a 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 formato disperso.

Muchas gracias por la ayuda !

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

Ensom Hodder
fuente
¿Qué tan escasa es la matriz? ¿Cómo se usa la SVD resultante? Si solo necesita una parte, probablemente podría aproximarlo mucho más barato.
Arnold Neumaier
@ArnoldNeumaier Disculpe, olvidé agregar la información escasa. He actualizado la publicación, junto con mi idea completa.
Ensom Hodder
cada uno de SLEPc, mahout e irlba sugeridos en las respuestas hasta ahora parecen adecuados para su problema.
Arnold Neumaier
1
¿Por qué quieres calcular todos los 120k? Parece que solo quieres que representen el 90% de la varianza, lo que debería ser mucho más barato de calcular.
Jed Brown
@JedBrown Hola Jed, tienes toda la razón! Solo estoy interesado en aquellos que representan el 90% de varianza, y también los vectores propios correspondientes (para transformar el conjunto de datos de prueba después). ¿Podrías decirme tus métodos más baratos ?
Ensom Hodder

Respuestas:

4

Sugiero el paquete irlba: produce prácticamente los mismos resultados que svd, pero puede definir un número menor de valores singulares para resolver. Un ejemplo, usando matrices dispersas para resolver el premio de Netflix, se puede encontrar aquí: http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html

Marc en la caja
fuente
Gracias por tus comentarios. De hecho, vi ese video y también probé el paquete irlba ayer, pero parecía que solo podía usarse para calcular algunos valores singulares. Sin embargo, como se indicó en la publicación, quiero calcular TODOS los valores singulares (120,000), para elegir el número adecuado de PC de acuerdo con las variaciones que representan. En este caso, supongo que irlba ya no es adecuado.
Ensom Hodder
¿Puedes usar los resultados de SVD de manera similar a PCA? ¿No necesita centrar los datos ANTES de realizar la SVD para realizar la PCA?
Zach
@Zach - SVD es el algoritmo principal detrás de PCA (ver prcomp - stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ). El centrado de datos también es un procedimiento estándar antes de someterse a PCA, aunque hay una amplia variedad de opciones dependiendo de su pregunta (por ejemplo, también se pueden aplicar diferentes tipos de escalado).
Marc en la caja el
¿Qué tan importante es si no centro los datos antes de SVD? Tengo una matriz dispersa que cabe en la memoria, pero el centrado la haría densa y demasiado grande para caber en la memoria.
Zach
@Zach: realmente depende de cómo desee relacionar sus muestras entre sí. Si no puede trabajar con datos centrados debido a los límites de memoria, entonces supongo que la decisión ha sido tomada por usted. En general, los datos de centrado hacen que el PCA funcione en una matriz de covarianza de las muestras, mientras que el centrado y el escalado de los datos hacen que el PCA funcione en una matriz de correlación. Para obtener más información sobre estas decisiones, puede considerar hacer una pregunta en stats.stackexchange.com o buscar las respuestas existentes con respecto a PCA.
Marc en la casilla del
8

Sugiero usar SLEPc para calcular una SVD parcial. Consulte el Capítulo 4 del Manual del usuario y las páginas de manual de SVD para obtener más detalles.

Jed Brown
fuente
1
Como quiere PCA, debe centrar los datos antes de calcular el SVD. Esto destruirá la escasez. ¿Hay alguna forma en que SLEPc se adapte a esto?
dranxo
3
Eso es escaso + rango bajo. SLEPc no necesita entradas de matriz, solo un operador lineal, que puede aplicarse como una matriz dispersa más una corrección.
Jed Brown
2

Voto por mahout, que también es bueno para otras tareas de PNL / TA e implementa map / reduce.

danas.zuokas
fuente
Sí, tienes razón, Mahout está exactamente en mi hoja de ruta. Pero prefiero crear un prototipo con algunas técnicas "simples" (supongo) de antemano.
Ensom Hodder
1

Sugeriría usar una descomposición incremental de valores singulares, de los cuales hay muchos en la literatura. Por ejemplo:

  • Los informes técnicos de Matthew Brand 1 y 2 son bastante fáciles de seguir.
  • La tesis de maestría de Chris Baker , su software IncPACK y su artículo posterior sobre el método SVD incremental
  • Bunch y Nielsen publicaron el primer artículo conocido
  • Documentos de Hall sobre la actualización de los problemas de valor propio 1 y 2
  • Análisis secuencial de Karhunen-Loeve por Levy, et al., Que es básicamente lo mismo

Todos estos enfoques se reducen a lo siguiente:

  • comenzar con un pequeño conjunto de datos
  • calcular un SVD de alguna manera (este paso es trivial para una matriz de una sola columna)
  • repita hasta que termine:
    • agregar nuevo conjunto de datos
    • use las reglas de actualización y SVD existentes para calcular la SVD del nuevo conjunto de datos

norte

Geoff Oxberry
fuente
0

Todavía puedes usar R.

Revolution Res una compilación de R que maneja conjuntos de datos que son más grandes que la RAM. Usa la función princomp.

También tiene una gama completa de funciones estadísticas especialmente diseñadas para problemas de estilo de big data que no se ajustan a la RAM, por ejemplo, regresión lineal, regresión logística, cuantiles, etc.

Puede descargar la versión académica con todas las funciones de forma gratuita, marcando la casilla "Soy un académico".

Aplazamiento de pago
fuente