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 ≫ n
En resumen, ¿hay una descripción algorítmica simple de este método para que pueda seguirlo?
Respuestas:
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.
fuente
Lo que estás haciendo ahora está cerca, pero debes asegurarte de multiplicar los vectores propios de
(data . data.T) / lines
a la izquierdadata.T
para 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 .A A ATA
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 ?A m×n n>>m ATA n×n ATA m×m AAT ATA AAT
Sea un vector propio de con valor propio . Entoncesv AAT λ
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 Av AAT ATv ATA A ATA v AAT AT ATv ATA
fuente
Parece que lo que quieres es el algoritmo NIPALS para realizar PCA. Es un algoritmo muy popular entre los estadísticos. Tiene muchas ventajas:
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.
fuente
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 .
fuente