En primer lugar, la reducción de dimensionalidad se usa cuando tiene muchas dimensiones covariadas y desea reducir el tamaño del problema girando los puntos de datos a una nueva base ortogonal y tomando solo ejes con la mayor varianza. Con 8 variables (columnas), su espacio ya es de baja dimensión, es poco probable que reducir el número de variables resuelva problemas técnicos con el tamaño de la memoria, pero puede afectar mucho la calidad del conjunto de datos. En su caso concreto, es más prometedor echar un vistazo al aprendizaje en líneamétodos En términos generales, en lugar de trabajar con todo el conjunto de datos, estos métodos toman una pequeña parte de ellos (a menudo denominados "mini lotes") a la vez y construyen un modelo de forma incremental. (Personalmente, me gusta interpretar la palabra "en línea" como una referencia a una fuente de datos infinitamente larga de Internet, como un feed de Twitter, donde simplemente no se puede cargar todo el conjunto de datos a la vez).
Pero, ¿qué pasaría si realmente quisiera aplicar la técnica de reducción de dimensionalidad como PCA a un conjunto de datos que no cabe en una memoria? Normalmente, un conjunto de datos se representa como una matriz de datos X de tamaño n x m , donde n es el número de observaciones (filas) ym es el número de variables (columnas). Por lo general, los problemas con la memoria provienen solo de uno de estos dos números.
Demasiadas observaciones (n >> m)
Cuando tiene demasiadas observaciones , pero el número de variables es de pequeño a moderado, puede construir la matriz de covarianza de forma incremental . De hecho, la PCA típica consiste en construir una matriz de covarianza de tamaño m x m y aplicarle una descomposición de valor singular. Con m = 1000 variables de tipo float64, una matriz de covarianza tiene un tamaño de 1000 * 1000 * 8 ~ 8Mb, que cabe fácilmente en la memoria y puede usarse con SVD. Por lo tanto, solo necesita construir la matriz de covarianza sin cargar todo el conjunto de datos en la memoria, tarea bastante manejable .
Alternativamente, puede seleccionar una pequeña muestra representativa de su conjunto de datos y aproximar la matriz de covarianza . Esta matriz tendrá las mismas propiedades que lo normal, solo que un poco menos precisa.
Demasiadas variables (n << m)
Por otro lado, a veces, cuando tiene demasiadas variables , la matriz de covarianza en sí misma no cabe en la memoria. Por ejemplo, si trabaja con imágenes de 640x480, cada observación tiene 640 * 480 = 307200 variables, lo que da como resultado una matriz de covarianza de 703 Gb. Eso definitivamente no es lo que le gustaría tener en la memoria de su computadora, o incluso en la memoria de su clúster. Por lo tanto, debemos reducir las dimensiones sin construir una matriz de covarianza.
Mi método favorito para hacerlo es la proyección aleatoria . En resumen, si tiene un conjunto de datos X de tamaño n x m , puede multiplicarlo por una matriz aleatoria dispersa R de tamaño m x k (con k << m ) y obtener una nueva matriz X ' de un tamaño mucho menor n x k con aproximadamente las mismas propiedades que el original. Por que funciona Bueno, debe saber que PCA tiene como objetivo encontrar un conjunto de ejes ortogonales (componentes principales) y proyectar sus datos en el primer kde ellos. Resulta que los vectores aleatorios dispersos son casi ortogonales y, por lo tanto, también pueden usarse como una nueva base.
Y, por supuesto, no tiene que multiplicar todo el conjunto de datos X por R : puede traducir cada observación x a la nueva base por separado o en mini lotes.
También hay un algoritmo algo similar llamado Random SVD . No tengo ninguna experiencia real con él, pero puedes encontrar un código de ejemplo con explicaciones aquí .
Como conclusión, aquí hay una breve lista de verificación para la reducción de dimensionalidad de grandes conjuntos de datos:
- Si no tiene tantas dimensiones (variables), simplemente use algoritmos de aprendizaje en línea.
- Si hay muchas observaciones, pero un número moderado de variables (la matriz de covarianza encaja en la memoria), construya la matriz de forma incremental y use SVD normal.
- Si el número de variables es demasiado alto, use algoritmos incrementales.