PCA(principal Component analysis)주성분 분석

November·2024년 10월 21일
post-thumbnail

PCA(principal Component analysis)

고차원데이터의 차원을 줄이는 것이 목적, 이때 기존 데이터의 variation을 유지하는 게 중요

고차원 데이터를 PC1, PC2, PC3만 선택하여 3차원으로 축소할 수 있음. 이러한 차원 축소는 계산과 시각화를 더 쉽게 만들어 데이터 분석을 더 간단하게 할 수 있게 해준다. 일부 정보가 손실되더라도 대부분의 중요한 정보가 유지되기 때문에 유용한 분석이 가능

💡

주성분 PC들은 서로 상관없고 독립적, 변동성(Variation)을 유지하는 순서대로 PC1, PC2,…

데이터에서 가장 큰 변동성을 가지는 방향(축)을 찾고 그게 바로 PC(주성분)

첫번째 주성분 PC1이 가장 큰 변동성을 설명하고 두번째 PC2는 첫번째와 직교하는 방향에서 변동성을 포착함

활용

  • 유전체 데이터 분석
  • 이미지 차원 줄여서 얼굴인식에 활용
  • 대규모 설문조사에서 답변 패턴 식별

왜 Maximum Variance냐?

유용한 차원 축소를 위해 ⇒ 원래 데이터의 중요한 정보를 최대한 잃지 않도록해서 데이터의 대략적인 구조 파악

v←pc$rotation : PC축을 정의하는 방향 벡터 (PC벡터)

head(pc$x) : 원래 데이터를 회전시켜서 PC1,PC2에 투영한 결과 (새로운 좌표계에서의 위치) 원점에서 PC축에 projection한 그 점까지의 거리 (PC SCORE)

PC Score 계산 방법 2가지

PC Score : 각 데이터 포인트가 주성분 벡터를 따라 얼마나 멀리 떨어져 있는지를 나타내는 값

PCA적용

pc ← prcomp(X,center=F,scale=F)

pc$x :원본 데이터를 새로운 PC 좌표계로 변환한 결과

X(nxp): X1과 X2로 이루어진 원본data

원본데이터 X행렬과 v행렬(PC벡터)의 곱

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)

PCs 어떻게 구하지?

Var(x)v1 = λv1

  • 고유벡터는 주성분(PCs)의 방향을 나타내고, 고유값은 그 주성분이 설명하는 분산의 크기를 나타냅니다.
    • eigenvector(고유벡터): 주성분의 방향을 정의하는 벡터. v1
    • eigenvalue(고유값): 각 주성분 벡터가 데이터의 분산을 얼마나 설명하는지 나타내는 값. λ

행렬 A가 벡터 v1에 어떤 변환을 가하더라도, 방향은 변하지 않고 크기만 λ만큼 변한다는 의미

Singular Value Decomposition (특이값 분해)

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 행렬의 열주성분에 해당하며, 주성분은 데이터의 분산이 가장 큰 방향을 나타냅니다.

행렬 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 주성분 벡터와 같다.

0개의 댓글