고차원데이터의 차원을 줄이는 것이 목적, 이때 기존 데이터의 variation을 유지하는 게 중요
고차원 데이터를 PC1, PC2, PC3만 선택하여 3차원으로 축소할 수 있음. 이러한 차원 축소는 계산과 시각화를 더 쉽게 만들어 데이터 분석을 더 간단하게 할 수 있게 해준다. 일부 정보가 손실되더라도 대부분의 중요한 정보가 유지되기 때문에 유용한 분석이 가능
💡주성분 PC들은 서로 상관없고 독립적, 변동성(Variation)을 유지하는 순서대로 PC1, PC2,…
데이터에서 가장 큰 변동성을 가지는 방향(축)을 찾고 그게 바로 PC(주성분)
첫번째 주성분 PC1이 가장 큰 변동성을 설명하고 두번째 PC2는 첫번째와 직교하는 방향에서 변동성을 포착함
활용
유용한 차원 축소를 위해 ⇒ 원래 데이터의 중요한 정보를 최대한 잃지 않도록해서 데이터의 대략적인 구조 파악
v←pc$rotation : PC축을 정의하는 방향 벡터 (PC벡터)
head(pc$x) : 원래 데이터를 회전시켜서 PC1,PC2에 투영한 결과 (새로운 좌표계에서의 위치) 원점에서 PC축에 projection한 그 점까지의 거리 (PC SCORE)
PC Score : 각 데이터 포인트가 주성분 벡터를 따라 얼마나 멀리 떨어져 있는지를 나타내는 값
pc ← prcomp(X,center=F,scale=F)
pc$x :원본 데이터를 새로운 PC 좌표계로 변환한 결과
X(nxp): X1과 X2로 이루어진 원본data
v← pc$rotaion : PC의 방향벡터
원본데이터 X와 PC벡터의 내적(Inner product) ⇒ PC SCORE!!!
point_score ← as.matrix(X[1,]) %*% v[,1]
proj_point ← data.frame(point_score %*% v[,1]) : PC Score와 PC1벡터의 내적 결과를 data frame으로 변환 ⇒ PC1벡터 방향으로 투영한 좌표를 구한 것
as.matrix(X[1,]) %*% v[,1] #X의 첫번째 행과 pc벡터의 첫번째 열(PC1) 내적 ⇒ PC Score
여기서 원본데이터(1.37 , 1.97)의 PC Score를 구한 결과 -2.38 이 ****나옴.
PC1벡터 방향으로 원본 데이터를 projection한 지점이 원점으로부터 거리가 2.38이라는 것
point_score %*% v[,1] PC Score와 PC1벡터를 내적 ⇒ projection한 점(1.59 , 1.77)
행렬 A가 벡터 v1에 어떤 변환을 가하더라도, 방향은 변하지 않고 크기만 λ만큼 변한다는 의미
n x p 의 임의의 행렬 X를 3개의 행렬 U,D,V^로 분해
💡U : n x n 원래 data 열벡터를 특정 축으로 투영하는데 사용
D: n x p의 대각행렬, 대각선에 X의 특이값이고 나머지 다 0
V^T: V의 전치행렬, 원래 data 열벡터의 주성분만 남는다.
V는 X^TX의 eigenvector로 구성된 행렬 고유벡터를 나타내고, 해당 고유벡터는 고유값과 연관되어 있다.
행렬 V의 열벡터들은 공분산 행렬의 고유벡터에 해당 ⇒ 결국 이게 주성분(Principal Components) 방향 !
SVD의 분해는 데이터를 설명하는 최대 분산 방향을 찾는 데 사용되며 PCA에서는 이 주성분 방향을 통해 데이터를 더 작은 차원으로 축소할 수 있다.
result_prcomp <- prcomp(dat,center=FALSE) #이미 중심화 해줘서 안함
result_svd <- svd(dat)
head(prcomp$rotation) : PC 주성분 방향벡터
head(result_svd$v) : SVD(특이값분해) 결과 중 V행렬의 열벡터(eigenvector) 반환 ⇒ PCA 주성분 벡터와 같다.