Las páginas 13-20 del tutorial que publicó proporcionan una explicación geométrica muy intuitiva de cómo se utiliza PCA para la reducción de la dimensionalidad.
La matriz de 13x13 que menciona es probablemente la matriz de "carga" o "rotación" (supongo que sus datos originales tenían 13 variables?) Que se pueden interpretar en una de dos formas (equivalentes):
Las (valores absolutos de) las columnas de su matriz de carga describen cuánto "contribuye" proporcionalmente cada variable a cada componente.
La matriz de rotación gira sus datos sobre la base definida por su matriz de rotación. Entonces, si tiene datos en 2-D y multiplica sus datos por su matriz de rotación, su nuevo eje X será el primer componente principal y el nuevo eje Y será el segundo componente principal.
EDITAR: esta pregunta se hace mucho, así que voy a presentar una explicación visual detallada de lo que sucede cuando usamos PCA para reducir la dimensionalidad.
Considere una muestra de 50 puntos generados a partir de y = x + ruido. El primer componente principal se ubicará a lo largo de la línea y = x y el segundo componente se ubicará a lo largo de la línea y = -x, como se muestra a continuación.
La relación de aspecto lo estropea un poco, pero confío en que los componentes son ortogonales. La aplicación de PCA rotará nuestros datos para que los componentes se conviertan en los ejes xey:
Los datos antes de la transformación son círculos, los datos después son cruces. En este ejemplo en particular, los datos no se giraron tanto como se voltearon a través de la línea y = -2x, pero podríamos haber invertido con la misma facilidad el eje y para que esto sea realmente una rotación sin pérdida de generalidad como se describe aquí .
La mayor parte de la varianza, es decir, la información en los datos, se extiende a lo largo del primer componente principal (que está representado por el eje x después de que hemos transformado los datos). Hay una pequeña variación a lo largo del segundo componente (ahora el eje y), pero podemos eliminar este componente por completo sin una pérdida significativa de información . Entonces, para colapsar esto de dos dimensiones a 1, dejamos que la proyección de los datos en el primer componente principal describa completamente nuestros datos.
Podemos recuperar parcialmente nuestros datos originales al rotarlos (ok, proyectarlos) nuevamente sobre los ejes originales.
Los puntos azules oscuros son los datos "recuperados", mientras que los puntos vacíos son los datos originales. Como puede ver, hemos perdido parte de la información de los datos originales, específicamente la variación en la dirección del segundo componente principal. Pero para muchos propósitos, esta descripción comprimida (usando la proyección a lo largo del primer componente principal) puede satisfacer nuestras necesidades.
Aquí está el código que usé para generar este ejemplo en caso de que quiera replicarlo usted mismo. Si reduce la varianza del componente de ruido en la segunda línea, la cantidad de datos perdidos por la transformación de PCA también disminuirá porque los datos convergerán en el primer componente principal:
set.seed(123)
y2 = x + rnorm(n,0,.2)
mydata = cbind(x,y2)
m2 = colMeans(mydata)
p2 = prcomp(mydata, center=F, scale=F)
reduced2= cbind(p2$x[,1], rep(0, nrow(p2$x)))
recovered = reduced2 %*% p2$rotation
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data with principal component vectors')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data after PCA transformation')
points(p2$x, col='black', pch=3)
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=mean(p2$x[,1])
,y1=1
,col='blue'
)
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=-1.5
,y1=0
,col='red'
)
lines(x=c(-1,1), y=c(2,-2), lty=2)
plot(p2$x, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='PCA dimensionality reduction')
points(reduced2, pch=20, col="blue")
for(i in 1:n){
lines(rbind(reduced2[i,], p2$x[i,]), col='blue')
}
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Lossy data recovery after PCA transformation')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
for(i in 1:n){
lines(rbind(recovered[i,], mydata[i,]), col='blue')
}
points(recovered, col='blue', pch=20)