¿Cómo realizar PCA para datos de muy alta dimensionalidad?

12

Para realizar el análisis de componentes principales (PCA), debe restar las medias de cada columna de los datos, calcular la matriz de coeficientes de correlación y luego encontrar los vectores propios y los valores propios. Bueno, más bien, esto es lo que hice para implementarlo en Python, excepto que solo funciona con matrices pequeñas porque el método para encontrar la matriz de coeficientes de correlación (corrcoef) no me permite usar una matriz con alta dimensionalidad. Como tengo que usarlo para imágenes, mi implementación actual realmente no me ayuda.

He leído que es posible tomar su matriz de datos y calcular lugar de , pero eso no funciona para mí. Bueno, no estoy exactamente seguro de entender lo que significa, además del hecho de que se supone que es una matriz lugar de (en mi caso ). Leí sobre aquellos en los tutoriales de caras propias, pero ninguno de ellos parecía explicarlo de tal manera que realmente pudiera entenderlo.D D / n D D / n n × n p × p p nDDD/nDD/nn×np×ppn

En resumen, ¿hay una descripción algorítmica simple de este método para que pueda seguirlo?

ameba dice reinstalar Monica
fuente
Lo que lees es correcto. La matriz se llama matriz de Gram. Sus vectores propios son componentes principales (a escala). Sus valores propios son exactamente idénticos, hasta el factor , a los valores propios de la matriz de covarianza . 1 / n D D / nDD1/nDD/n
ameba dice Reinstate Monica

Respuestas:

10

La forma más fácil de hacer PCA estándar es centrar las columnas de su matriz de datos (suponiendo que las columnas correspondan a diferentes variables) restando los medios de la columna y luego realizar una SVD. Los vectores singulares izquierdos, multiplicados por el valor singular correspondiente, corresponden a los componentes principales (estimados). Los vectores singulares correctos corresponden a las direcciones (estimadas) de los componentes principales; estos son los mismos que los vectores propios dados por PCA. Los valores singulares corresponden a las desviaciones estándar de los componentes principales (multiplicados por un factor de raíz n, donde n es el número de filas en su matriz de datos), lo mismo que la raíz cuadrada de los valores propios dados por PCA.

Si desea hacer PCA en la matriz de correlación, deberá estandarizar las columnas de su matriz de datos antes de aplicar la SVD. Esto equivale a restar los medios (centrado) y luego dividirlos por las desviaciones estándar (escalado).

Este será el enfoque más eficiente si desea la PCA completa. Puede verificar con algo de álgebra que esto le da la misma respuesta que hacer la descomposición espectral de la matriz de covarianza de la muestra.

También hay métodos eficientes para calcular una SVD parcial, cuando solo necesita algunas de las PC. Algunos de estos son variantes de la iteración de potencia. El algoritmo de Lanczos es un ejemplo que también está relacionado con mínimos cuadrados parciales. Si su matriz es enorme, es mejor que tenga un método aproximado. También hay razones estadísticas para regularizar PCA cuando este es el caso.

vqv
fuente
Corrígeme si estoy equivocado, pero creo que el algoritmo de Lanczos realiza una descomposición propia y no SVD.
ameba dice Reinstate Monica
1
Un lector interesado puede buscar aquí más detalles sobre cómo realizar PCA a través de SVD: Relación entre SVD y PCA. ¿Cómo usar SVD para realizar PCA?
ameba dice Reinstate Monica
10

Lo que estás haciendo ahora está cerca, pero debes asegurarte de multiplicar los vectores propios de (data . data.T) / linesa la izquierda data.Tpara obtener los vectores propios de (data.T . data) / lines. Esto a veces se llama el "truco de transposición".

Aquí hay algunos detalles más. Suponga que tiene una matriz que desea realizar PCA; por simplicidad, suponga que las columnas de ya se han normalizado para que tengan una media cero, por lo que solo necesitamos calcular los vectores propios de la matriz de covarianza .AAATA

Ahora, si es una matriz , con , entonces es una matriz muy grande . Entonces, en lugar de calcular los vectores propios de , nos gustaría calcular los vectores propios de la matriz mucho más pequeña , suponiendo que podamos descubrir una relación entre los dos. Entonces, ¿cómo se relacionan los vectores propios de con los vectores propios de ?Am×nn>>mATAn×nATAm×mAATATAAAT

Sea un vector propio de con valor propio . EntoncesvAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

En otras palabras, si es un vector propio de , entonces es un vector propio de , con el mismo valor propio. Entonces, cuando se realiza un PCA en , en lugar de encontrar directamente los vectores propios de (que puede ser muy costoso), es más fácil encontrar los vectores propios de y luego multiplicarlos a la izquierda por para obtener los vectores propios de .A A T A T v A T A A A T A v A A T A T A T v A T AvAATATvATAAATAvAATATATvATA

raegtin
fuente
1
Esto suena como el "truco del kernel" aplicado a PCA. en.wikipedia.org/wiki/Kernel_PCA Es una muy buena forma de manejar ciertas matrices grandes.
Galaad
+1. Quizás debería agregarse que se llama matriz de Gram. AA
ameba dice Reinstate Monica
8

Parece que lo que quieres es el algoritmo NIPALS para realizar PCA. Es un algoritmo muy popular entre los estadísticos. Tiene muchas ventajas:

  • Computacionalmente menos costoso que SVD o métodos de descomposición de valores propios si solo se requieren los primeros componentes.
  • Tiene requisitos de almacenamiento más modestos en general porque la matriz de covarianza nunca se forma. Esta es una propiedad muy importante para conjuntos de datos muy grandes.
  • Puede manejar los datos que faltan en el conjunto de datos (aunque eso no es un problema en su problema, ya que se trata de imágenes).

Descripción
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Algoritmo
Aquí hay una descripción simple y excelente del algoritmo (en la sección 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

Recuerde hacer una escala de centro central primero antes de hacer PCA, ya que es sensible a la escala.

Galaad
fuente
4

Para agregar a la respuesta de Gilead, son algoritmos computacionalmente menos costosos para PCA truncados. NIPALS es de hecho muy popular, pero he tenido mucho éxito con métodos aproximados que realizan una sucesión de ajustes en datos parciales (lo que a menudo se llama PCA por proyección aleatoria). Esto se discutió en un hilo de metaoptimización .

Al mencionar Python, permítanme señalar que el algoritmo se implementa en scikit-learn : la clase PCA . En particular, se usa en un ejemplo que demuestra caras propias .

Gael Varoquaux
fuente