¿Cómo revertir PCA y reconstruir variables originales de varios componentes principales?

113

El análisis de componentes principales (PCA) se puede utilizar para reducir la dimensionalidad. Después de realizar tal reducción de dimensionalidad, ¿cómo se puede reconstruir aproximadamente las variables / características originales a partir de un pequeño número de componentes principales?

Alternativamente, ¿cómo se pueden eliminar o descartar varios componentes principales de los datos?

En otras palabras, ¿cómo revertir la PCA?


Dado que PCA está estrechamente relacionado con la descomposición de valores singulares (SVD), la misma pregunta se puede hacer de la siguiente manera: ¿cómo revertir SVD?

ameba
fuente
10
Estoy publicando este hilo de preguntas y respuestas, porque estoy cansado de ver docenas de preguntas que hacen esta misma pregunta y no poder cerrarlas como duplicados porque no tenemos un hilo canónico sobre este tema. Hay varios hilos similares con respuestas decentes, pero todos parecen tener serias limitaciones, como por ejemplo centrarse exclusivamente en R.
ameba
44
Aprecio el esfuerzo: creo que existe una gran necesidad de recopilar información sobre PCA, lo que hace, lo que no hace, en uno o varios hilos de alta calidad. ¡Me alegra que te hayas encargado de hacer esto!
Sycorax
1
No estoy convencido de que esta respuesta canónica "limpieza" cumpla su propósito. Lo que tenemos aquí es una excelente y genérica pregunta y respuesta, pero cada una de las preguntas tenía algunas sutilezas sobre PCA en la práctica que se pierden aquí. Esencialmente, ha tomado todas las preguntas, hecho PCA en ellas y descartado los componentes principales inferiores, donde a veces, se ocultan detalles ricos e importantes. Además, ha vuelto a la notación de álgebra lineal de libros de texto, que es precisamente lo que hace que la PCA sea opaca para muchas personas, en lugar de utilizar la lengua franca de los estadísticos casuales, que es R.
Thomas Browne
1
@ Thomas Gracias. Creo que tenemos un desacuerdo, feliz de discutirlo en el chat o en Meta. Muy brevemente: (1) De hecho, podría ser mejor responder cada pregunta individualmente, pero la dura realidad es que no sucede. Muchas preguntas simplemente quedan sin respuesta, como la suya probablemente lo habría hecho. (2) La comunidad aquí prefiere fuertemente las respuestas genéricas útiles para muchas personas; puedes ver qué tipo de respuestas son las más votadas. (3) Estoy de acuerdo con las matemáticas, ¡pero es por eso que di el código R aquí! (4) No estoy de acuerdo con la lengua franca; personalmente, no sé R.
ameba
@amoeba Me temo que no sé cómo encontrar dicho chat, ya que nunca antes había participado en meta discusiones.
Thomas Browne

Respuestas:

147

PCA calcula los vectores propios de la matriz de covarianza ("ejes principales") y los ordena por sus valores propios (cantidad de varianza explicada). Los datos centrados se pueden proyectar sobre estos ejes principales para obtener componentes principales ("puntajes"). A los fines de la reducción de la dimensionalidad, se puede mantener solo un subconjunto de componentes principales y descartar el resto. (Vea aquí la introducción de un laico a PCA ).

Sea la matriz de datos con filas (puntos de datos) y columnas (variables o características). Después de restar la media del vector de cada fila, obtenemos el centrado matriz de datos . Sea la matriz de algunos vectores propios que queremos usar; estos serían con mayor frecuencia los vectores propios con los valores propios más grandes. Entonces la matriz de las proyecciones de PCA ("puntajes") estará dada simplemente por . n×pnpXrawn×pnpμXVp×kkkn×kZ=XV

Esto se ilustra en la figura a continuación: la primera subtrama muestra algunos datos centrados (los mismos datos que uso en mis animaciones en el hilo vinculado) y sus proyecciones en el primer eje principal. La segunda subtrama muestra solo los valores de esta proyección; la dimensionalidad se ha reducido de dos a uno:

ingrese la descripción de la imagen aquí

Para poder reconstruir las dos variables originales a partir de este componente principal, podemos volver a a dimensiones con . De hecho, los valores de cada PC deben colocarse en el mismo vector que se usó para la proyección; compare las subparcelas 1 y 3. El resultado viene dado por . Lo estoy mostrando en la tercera subtrama anterior. Para obtener la reconstrucción final , necesitamos agregar el vector medio a eso:pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

Tenga en cuenta que uno puede ir directamente desde la primera subtrama a la tercera multiplicando con la matriz ; Se llama matriz de proyección . Si todos los se utilizan vectores propios, entonces es la matriz de identidad (no se realiza ninguna reducción de dimensionalidad, por lo tanto "reconstrucción" es perfecto). Si solo se usa un subconjunto de vectores propios, no es identidad.XVVpVV

Esto funciona para un punto arbitrario en el espacio de la PC; se puede asignar al espacio original a través de .zx^=zV

Descartar (eliminar) PC líderes

A veces, uno desea descartar (eliminar) una o algunas de las PC principales y conservar el resto, en lugar de conservar las PC principales y descartar el resto (como se indicó anteriormente). En este caso, todas las fórmulas permanecen exactamente iguales , pero debe constar de todos los ejes principales, excepto los que se desean descartar. En otras palabras, siempre debe incluir todas las PC que uno quiera conservar.VV

Advertencia sobre PCA sobre correlación

Cuando PCA se realiza en la matriz de correlación (y no en la matriz de covarianza), los datos sin procesar no solo se centran restando sino que también se escalan dividiendo cada columna por su desviación estándar . En este caso, para reconstruir los datos originales, es necesario volver a escalar las columnas de con y solo entonces volver a agregar el vector medio .XrawμσiX^σiμ


Ejemplo de procesamiento de imagen

Este tema a menudo surge en el contexto del procesamiento de imágenes. Considere a Lenna , una de las imágenes estándar en la literatura de procesamiento de imágenes (siga los enlaces para encontrar de dónde proviene). A continuación, a la izquierda, muestro la variante en escala de grises de esta imagen (archivo disponible aquí ).512×512

Dos versiones en escala de grises de la imagen de Lenna.  El de la derecha es granulado pero definitivamente reconocible.

Podemos tratar esta imagen en escala de grises como una matriz de datos . Realizo PCA en él y calculo usando los primeros 50 componentes principales. El resultado se muestra a la derecha.512×512XrawX^raw


Revertir SVD

PCA está muy relacionado con la descomposición de valores singulares (SVD), ver Relación entre SVD y PCA. ¿Cómo usar SVD para realizar PCA? para más detalles. Si una matriz se edita SVD como y se selecciona un vector -dimensional que representa el punto en el espacio "reducido" de dimensiones, luego para volver a en dimensiones uno necesita multiplicarlo con .n×pXX=USVkzUkpS1:k,1:kV:,1:k


Ejemplos en R, Matlab, Python y Stata

Realizaré PCA en los datos de Fisher Iris y luego lo reconstruiré utilizando los dos primeros componentes principales. Estoy haciendo PCA en la matriz de covarianza, no en la matriz de correlación, es decir, no estoy escalando las variables aquí. Pero todavía tengo que agregar la media de nuevo. Algunos paquetes, como Stata, se encargan de eso a través de la sintaxis estándar. Gracias a @StasK y @Kodiologist por su ayuda con el código.

Verificaremos la reconstrucción del primer punto de datos, que es:

5.1        3.5         1.4        0.2

Matlab

load fisheriris
X = meas;
mu = mean(X);

[eigenvectors, scores] = pca(X);

nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);

Xhat(1,:)

Salida:

5.083      3.5174      1.4032     0.21353

R

X = iris[,1:4]
mu = colMeans(X)

Xpca = prcomp(X)

nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)

Xhat[1,]

Salida:

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.0830390    3.5174139    1.4032137    0.2135317

Para el ejemplo R resuelto de la reconstrucción de imágenes por PCA, consulte también esta respuesta .

Pitón

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(Xhat[0,])

Salida:

[ 5.08718247  3.51315614  1.4020428   0.21105556]

Tenga en cuenta que esto difiere ligeramente de los resultados en otros idiomas. Esto se debe a que la versión de Python del conjunto de datos de Iris contiene errores .

Stata

webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  
ameba
fuente
1
En MATLAB puede recuperar mu de las salidas PCA estándar, y también puede suministrar el número de componentes en las entradas.
Aksakal
2
@ Aksakal Intenté hacer que los tres extractos de código fueran lo más parecidos (y claros) posible; en particular, quería calcular a mano antes de llamar a pca (), y también ejecutar PCA con todos los componentes y usar solo componentes al realizar productos punto entre puntajes y vectores propios. Ahora he modificado el código de Python para seguir el mismo patrón. μnComp
ameba
3
Quitaría todo de la respuesta que no esté relacionada con la respuesta directa a la pregunta, como la imagen y el procesamiento de imágenes de esa linda chica. Si alguien no está interesado en las imágenes, dificulta el consumo. Recuerde que quien hace la pregunta ya está profundamente confundido.
Aksakal
55
Lenna es un conjunto de datos tan estándar como el iris.
StasK
2
@amoeba Estaba hablando de tamaño, profundidad de bits, incluso píxeles negros en el borde. No tengo una versión definitiva http://www.ece.rice.edu/~wakin/images/ : "Parece que hay muchas versiones de la imagen de prueba de Lena (también conocida como" Lenna "). Shapiro notó este problema en su artículo zerotree de 1993, y sigue siendo sorprendentemente cierto hoy "
Laurent Duval el