El algoritmo PCA más rápido para datos de alta dimensión

11

Me gustaría realizar una PCA en un conjunto de datos compuesto por aproximadamente 40 000 muestras, cada muestra mostrando alrededor de 10 000 características.

El uso de la función princomp de Matlab lleva más de media hora, momento en el que elimino el proceso. Me gustaría encontrar una implementación / algoritmo que se ejecute en menos de 10 minutos. ¿Cuál sería el algoritmo más rápido? ¿Cuánto tiempo tomaría un i7 dual core / 4GB Ram?

meloso
fuente
Sí, tienes razón, debería ser más preciso. Tarda más de media hora, luego decidí matar el proceso. Tengo que hacer esto al menos diez veces, sería bueno tener algo que funcione en menos de 10 minutos
Suave
¿Qué tan escasa es tu matriz?
Arnold Neumaier
El porcentaje de ceros en la matriz está por encima del 80%
suave
Echa un vistazo a kernal-PCA también.
meawoppl

Respuestas:

11

En primer lugar, debe especificar si desea todos los componentes o los más importantes.

ARN×MNM

CRM×MO(NM2)O(M3)O(2M2)1.5A .

AA

C

Alejandro
fuente
2

Supongo que solo necesita unos pocos (o unos cientos) pares de valores singulares / vectores dominantes. Entonces es mejor usar un método iterativo, que será mucho más rápido y consumirá mucha menos memoria.

En Matlab, ver

ayuda svds

Arnold Neumaier
fuente
Sí, parece que los métodos iterativos son mucho más rápidos si solo necesito los primeros cien componentes.
suave
En lo que respecta a los svds, traté de poner mi matriz en un formato escaso y modificar la función princomp para poner svds en lugar de svd, y para mi sorpresa, me llevó mucho más tiempo en una matriz 2000 * 4000 (180 s en lugar de 15 s ) Extraño ...
suave
1
No es necesario cambiar al formato disperso. Además, debe reducir la cantidad de vectores singulares que desea calcular. Para calcular el svd completo, svds no es adecuado.
Arnold Neumaier
2
También son notables para los modos dominantes los métodos svd aleatorios más nuevos, como en stanford.edu/group/mmds/slides2010/Martinsson.pdf
Nick Alger
2

Puede consultar mi respuesta en Cross Validated . No quería copiarlo aquí. Básicamente, puede usar SVD aleatorio rápido para calcular la base y los coeficientes de PCA.

petrichor
fuente