게시 한 자습서의 13-20 페이지는 PCA가 차원 축소에 어떻게 사용되는지에 대한 매우 직관적 인 기하학적 설명을 제공합니다.
언급 한 13x13 행렬은 아마도 "로드 중"또는 "회전"행렬입니다 (원래 데이터에 13 개의 변수가 있다고 생각합니까?)는 두 가지 (동등한) 방법 중 하나로 해석 할 수 있습니다.
로딩 매트릭스의 (절대 값) 열은 각 변수가 각 구성 요소에 비례 적으로 "기여"되는 정도를 나타냅니다.
회전 행렬은 회전 행렬에 의해 정의 된 기준으로 데이터를 회전시킵니다. 따라서 2 차원 데이터가 있고 데이터에 회전 행렬을 곱하면 새 X 축이 첫 번째 주성분이되고 새 Y 축이 두 번째 주성분이됩니다.
편집 :이 질문은 많이 제기되므로 차원 축소를 위해 PCA를 사용할 때 무슨 일이 일어나고 있는지에 대한 자세한 시각적 설명을 제시하려고합니다.
y = x + 노이즈에서 생성 된 50 포인트 샘플을 고려하십시오. 아래 그림과 같이 첫 번째 주요 구성 요소는 선 y = x를 따라 배치되고 두 번째 구성 요소는 선 y = -x를 따라 배치됩니다.
종횡비는 약간 엉망이지만 구성 요소가 직교하다는 것을 내 말로 받아들입니다. PCA를 적용하면 데이터가 회전하여 구성 요소가 x 및 y 축이됩니다.
변환 전의 데이터는 원이고 이후의 데이터는 교차입니다. 이 특정 예에서, 데이터는 y = -2x 선을 따라 뒤집히는만큼 회전되지 않았지만 여기에서 설명한 바와 같이 일반성을 잃지 않고 진정한 회전을하기 위해 y 축을 쉽게 뒤집을 수있었습니다 . .
분산의 대부분, 즉 데이터 의 정보 는 첫 번째 주성분 (데이터를 변환 한 후 x 축으로 표시됨)을 따라 분산됩니다. 두 번째 구성 요소 (현재 y 축)를 따라 약간의 차이가 있지만, 정보의 큰 손실없이이 구성 요소를 완전히 삭제할 수 있습니다 . 이를 2 차원에서 1로 축소하기 위해 데이터를 첫 번째 주요 구성 요소로 투영하면 데이터를 완전히 설명 할 수 있습니다.
원래 데이터를 원래 축으로 다시 회전 (투영)하여 부분적으로 복구 할 수 있습니다.
진한 파란색 점은 "복구 된"데이터이고 빈 점은 원래 데이터입니다. 보시다시피, 우리는 원래 데이터에서 일부 정보, 특히 두 번째 주성분 방향의 차이를 잃었습니다. 그러나 많은 목적을 위해,이 압축 된 설명 (첫 번째 주요 구성 요소를 따라 투영을 사용)은 우리의 요구에 적합 할 수 있습니다.
이 예제를 생성하는 데 사용한 코드는 다음과 같습니다. 두 번째 줄에서 노이즈 구성 요소의 분산을 줄이면 데이터가 첫 번째 주요 구성 요소로 수렴되기 때문에 PCA 변환에 의해 손실 된 데이터의 양도 줄어 듭니다.
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)