2011-12-05 13 views
5

Tengo una matriz muy grande (aproximadamente 500000 * 20000) que contiene los datos que analizaría con pca. Para hacer esto, estoy usando la biblioteca ParallelColt, pero ambos usan la descomposición de valores singulares y la descomposición de valores propios para obtener los vectores propios y los valores propios de la matriz de covarianza. Sin embargo, estos métodos pierden el montón y tengo errores "OutOfMemory" ...Hacer PCA en java en matriz grande

También usando SparseDoubleMatrix2D (los datos son muy escasos) los errores siguen siendo, por lo que pregunto: ¿cómo puedo solucionar este problema?

¿Cambiar biblioteca?

+0

es Java la única lengua considerada, puedo imaginar esta matriz es increíblemente grande ......? – Beginner

+0

No veo cómo cambiar a otro idioma cambiaría algo. – duffymo

Respuesta

2

Puede calcular PCA con la regla de Oja: es un algoritmo iterativo, que mejora una estimación de la PCA, un vector por vez. Es más lento que el PCA habitual, pero requiere que guarde solo un vector en la memoria. También es muy estable numéricamente

http://en.wikipedia.org/wiki/Oja%27s_rule

0

No estoy seguro de que las bibliotecas cambiantes ayudarán. Necesitará dobles (8 bytes por). No sé cuál sería la dimensión de la matriz de covarianza en este caso, pero las bibliotecas de conmutación no cambiarán demasiado los cálculos subyacentes.

¿Cuál es la configuración de -Xmx cuando ejecuta? ¿Qué pasa con el tamaño de gen permanente? Quizás puedas aumentarlos.

¿El algoritmo se detiene inmediatamente o se ejecuta por un tiempo? Si es el último, puede conectarse al proceso utilizando Visual VM 1.3.3 (descargue e instale todos los complementos). Te permitirá ver lo que sucede en el montón, en los hilos, etc. Podría ayudarte a descubrir la causa raíz.

A "Google search para" valor propio de Java de matrículas grandes "apareció this library de Google. Si se desplaza hacia abajo en los comentarios, me pregunto si un análisis de autovalores de Lanczos podría ayudar. Puede ser suficiente si puede obtener un subconjunto de los valores propios.

Estas implementaciones de SVM dicen ser útil para grandes conjuntos de datos:

http://www.support-vector-machines.org/SVM_soft.html

no creo que se puede pedir más de 2 GB para una JVM:

http://www.theserverside.com/discussions/thread.tss?thread_id=26347

acuerdo Para Oracle, necesitará una JVM de 64 bits que se ejecute en un sistema operativo de 64 bits:

http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit

+0

dim del resultado será 500000x500000. – Beginner

+0

¿Seguro de eso? ¿No 20K x 20K? – duffymo

+0

Esta es la matriz de covarianza. (Se ingresa X) http://upload.wikimedia.org/wikipedia/es/math/6/7/6/67616c643a158c1e00a8e4d5ec3d0b1a.png – Beginner

0

Creé algunos algoritmos incrementales escasos para este tipo de problema. Convenientemente, está construido sobre Colt.

Consulte la clase HallMarshalMartin en la biblioteca trickl-cluster a continuación. Puede alimentarlo en trozos de filas a la vez, por lo que debería solucionar sus problemas de memoria.

El código está disponible bajo la licencia GPL. Me temo que acabo de lanzarlo, por lo que es corto en documentación, con suerte es bastante auto explicativo. Hay pruebas JUnit que deberían ayudar con el uso.

http://open.trickl.com/trickl-pca/index.html