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:
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:pV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+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.XVV⊤pVV⊤
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
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=USV⊤kzUkpS⊤1: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