주성분 분석(Principal Component Analysis)


[References]

1. 이상구 with 이재화, [빅북] 인공지능을 위한 기초수학(Basic Mathematics for Artificial Intelligence), 교보문고 POD, 2019.

    http://matrix.skku.ac.kr/math4ai/


[Key point]

주성분 분석(Principal Component Analysis, PCA)은 가장 널리 사용되는 차원 축소 기법 중 하나로,

원 데이터의 분포를 최대한 보존하면서 서로 직교하는 새 기저(축)를 찾아, 고차원 공간의 데이터들을

선형 연관성이 없는 저차원 공간으로 변환한다. 이때 계산은 주로 행렬의 특이값 분해(SVD)를 사용한다.

[참고]  PCA의 자세한 유도 과정은 웹 사이트 http://matrix.skku.ac.kr/math4ai/part4/ 를 참조하라.

 

주성분 분석(Principal Component Analysis)의 계산 방법

① $n\times p$의 데이터 행렬 $X$를 구성한다. 여기서 $n$은 표본(sample)의 개수이고, $p$는 데이터의 특성(feature)을 나타내는 확률변수의 개수이다.

② $X$를 센터링(centering, 각 열의 평균을 0으로 만드는 것)하여 ${\tilde X}$를 구한다.

③ ${\tilde X}$의 특이값 분해(SVD)를 구하여 ${\tilde X} = USV^T$를 얻는다.

[참고]  SVD  http://matrix.skku.ac.kr/2018-album/SVD.html 

④ 관계식 $Z={\tilde X}V=US$ 을 이용하여 PC score를 구한다.


[결과]

① $V$의 열벡터가 주축(principal axes)이 된다.

② $S$의 주 대각선 성분, 즉, 특이값 $s_i$는 공분산 행렬 $\Sigma = \frac{1}{n}{\tilde X}^T{\tilde X}$의 고윳값 $\lambda_i$와 관계식

          $\lambda_i = \frac{s_i^2}{n}$

    을 만족하며, $\lambda_i$는 대응하는 PC의 분산이 된다.

③ 데이터를 $p$차원에서 $k$ ($\ll p$) 차원으로 줄이기 위하여 $U$의 처음 $k$개의 열벡터 $U_k$와 $S$의 $k$번째 선행 주 부분 행렬

   (leading principal submatrix) $S_k$를 택하면, $U_kS_k$는 처음 $k$개의 PC를 포함하는 $n\times k$ 행렬이 된다.

          $Z_k = U_kS_k$

④ ③에서 얻은 $Z_k$에 $s_1$, $s_2$, $\ldots$, $s_k$에 대응되는 주축으로 이루어진 행렬 $V_k^T$를 곱하면, $X_k=U_kS_kV_k^T$는 처음 $k$개의

   PC로부터 원 데이터를 복원하도록 해주는 rank가 $k$인 $n\times p$ 행렬이 된다. 이는 ${\tilde X}$의 SVD에서 크기 순서대로 $k$개의 

   큰 특이값 $s_1\ge s_2 \ge \cdots \ge s_k > 0$과 이에 대응되는 $U$와 $V$의 처음 $k$개의 열벡터를 택하는 것과 같다.

   이를 truncated SVD라고 한다. 실제로 $X_k$는 rank가 $k$인 행렬 중에서 ${\tilde X}$에 가장 가까운 행렬이 된다.

          ${\tilde X} \approx X_k := \sum_{i=1}^k s_i {\bf u}_i {\bf v}_i ^T = \textrm {arg}\min_{ \textrm {rank}(W)\le k} \| {\tilde X} - W \|_F ^2$

 

[예시] 사람들이 새 컴퓨터를 선택할 때 관심을 갖는 아래 사항에 관하여 척도가 7점인 4문항의 리커트(Likert)

설문 조사를 16명에게 실시하였다.   (1: 매우 그렇지 않다 – 7: 매우 그렇다)

[출처]  http://yatani.jp/teaching/doku.php?id=hcistats:PCA


     Price        가격이 저렴하다.

     Software     운영체제가 사용하려는 소프트웨어와 호환된다.

     Aesthetics    디자인이 매력적이다.

     Brand        유명 브랜드의 제품이다.

 

데이터는 다음과 같다.

ParticipantPriceSoftwareAestheticsBrand
P1 6 5 3 4
P2 7 3 2 2
P3 6 4 4 5
P4 5 7 1 3
P5 7 7 5 5
P6 6 4 2 3
P7 5 7 2 1
P8 6 5 4 4
P9 3 5 6 7
P10 1 3 7 5
P11 2 6 6 7
P12 5 7 7 6
P13 2 4 5 6
P14 3 5 6 5
P15 1 6 5 5
P16 2 3 7 7

이를 Sage에서 R 코드로 구현한 자료는 http://math1.skku.ac.kr/home/pub/212/ 에서 확인할 수 있다.

본 페이지에서는 Sage를 활용하여 계산한다.

# 데이터 행렬 입력 # 각 행은 변수 Price, Software, Aesthetics, Brand에 해당하는 데이터를 의미한다. X = matrix(RDF, [[6, 7, 6, 5, 7, 6, 5, 6, 3, 1, 2, 5, 2, 3, 1, 2], [5, 3, 4, 7, 7, 4, 7, 5, 5, 3, 6, 7, 4, 5, 6, 3], [3, 2, 4, 1, 5, 2, 2, 4, 6, 7, 6, 7, 5, 6, 5, 7], [4, 2, 5, 3, 5, 3, 1, 4, 7, 5, 7, 6, 6, 5, 5, 7]]) X = X.transpose() # data matrix print(X) 

 

# 데이터 행렬을 센터링(centering, 각 행의 평균을 0으로)한다. # 본 예제에서는 센터링 한 후에 다시 각 열을 해당 확률변수의 표준편차로 나누었다. # 이를 scaling이라 하는데, 필요에 따라 scaling도 진행할 수 있다. n = X.nrows() # 행의 개수 p = X.ncols() # 열의 개수 X_ctr = zero_matrix(RDF, n, p) # 행렬 준비 import numpy as np for col in range(p): v = np.array(X.column(col)) m = np.mean(v) st = np.std(v) for row in range(n): X_ctr[row,col] = (X[row,col] - m)/st # X_ctr는 센터링된 행렬 print(X_ctr) 

 

# 특이값 분해 (Singular Value Decomposition)를 구한다. X_ctr = U*S*V.transpose() U, S, V = X_ctr.SVD() Var_PC = [S[i,i]^2/n for i in range(p)] # Variance of PC (eigenvalues) print("Variance of PC ", Var_PC) Prop_Var = [100*Var_PC[i]/sum(Var_PC) for i in range(p)] # Proportion of Variance print("Proportion of Variance ", Prop_Var) # Scree Plot list_plot(Var_PC, plotjoined = True, color = 'red', axes_labels = ['','Variances']) 

 

# PC score를 계산한다. Z = X_ctr*V PC_score = U*S PC12 = PC_score[:, 0:2] # 시각화를 위해 첫번째, 두번째 성분까지만 사용 print(PC12) 

 

# 데이터를 평면에 시각화 한다. point([PC12.row(i) for i in range(n)], color = 'red') 

 

(아래 SageMathCell에 실습해보세요)




   

Copyright @ 2020 SKKU Matrix Lab. All rights reserved.
Made by Manager: Prof. Sang-Gu Lee and Dr. Jae Hwa Lee
*This research was supported by Basic Science Research Program through the National Research Foundation of Korea (NRF) funded by the Ministry of Education (2017R1D1A1B03035865).