Machine Learning/Fundamentals

PCA(concepts)

metamong 2022. 5. 30.

* dimensionality reduction 기법 중 대표적인 방법인 PCA에 대해서 알아보자!

concepts>

고차원의 data를 낮은 차원으로 차원 축소하는 기법 (dimensionality reduction)
② 기준이 되는 정보는 data의 분산! (분산을 통해 데이터가 흩어진 정도를 알 수 있기 때문)
③ 고차원 data의 정보(분산)를 최대한 유지하는 eigenvector를 찾고, 해당 vector에 대해 data를 linear projection하는 과정


- 예시 -


Q. 2차원 상에 주어진 data를 1차원으로 축소하려고 할 때 아래 두 line 중 원본 data의 정보를 최대한 많이 살린 채로 축소된 것은?

오른쪽 line을 골라야 한다! (기존 2차원 data 분산을 최대한 유지하는 data이기 때문) -

(for simplicity) step-by-step> (2D to 1D)

* 하단 PCA 순서들은 'PCA를 이해하기 위해' 만든 비유적인 과정들로 실제 PCA 연산을 할 때 쓰이는 부분과는 약간 다르다.
(실제로는 covariance matrix, standardization 등등의 과정을 거치며 정확한 과정은 글 하단에 code와 함께 소개함)

① 모든 data의 각 axis 별 평균을 모은 평균 point를 원점에 갖다 댄다

② 원점을 지나는 random line 중 가장 data를 잘 설명하는 line 'PC1'을 첫번째로 구한다
(PCA가 best한 fitting line을 골라줌)

Q. PC1 구하는 과정?


→ 일단 원점을 지나는 random한 line 한 개를 결정한다. (위 red dotted line)
→ 연두색 점인 data에서 위 red dotted line에 project한다. (projection 거리 b)
→ 모든 data가 red dotted line(PC1 후보군)에 이제 projection되었고, 우리는 해당 red dotted line이 PC1이 될 자격이 있는 지 판단해야 함
→ 이 때 ①모든 data의 projection distance인 b를 최소화하는 line을 구하거나, ②projected된 data(X 표시)에서 원점까지의 거리인 a를 최대화하는 line을 구하는 두 가지 방법이 존재한다.

(※ 피타고라스 정리에 의해 원래 data(동그라미)와 원점(평균)까지의 거리인 c는 항상 일정한 값을 가지므로 $c^2 = a^2 + b^2$에 의해 a와 b값은 서로 반비례 관계를 가진다. - 위 그림에서 보듯이 a, b, c가 각각 변으로 하는 삼각형을 형성하고 있음)

→ 주로 ②방법을 채택하고 있으며, 거리 자체만으로는 (-) 음수값이 존재할 수 있으므로 각각의 거리를 제곱하여 sum 합(SS라 함)을 구한다.

→ 요약 'maximizing the sum of the squared distances from the projected points to the origin' 

→ 그렇게 해서 결정된 PC1 

(예를 들어 PC1의 slope(기울기)이 0.25라면 우리는 x축의 unit이 4 증가한다면, y축의 unit이 1 증가한다고 해석할 수 있다 (즉 x축이 y축보다 4배 더 중요함!)
→ 여기서 해당 PC1을 x-axis와 y-axis의 linear combination이라고 부른다

③ eigenvector를 이용한 PCA with SVD(Singular Value Decomposition)
→ 이제 구한 PC1의 eigenvector를 구한다.


→ PC1의 slope이 4라고 했을 때, PC1의 eigenvector를 구할려면 eigenvector 값(vector length)을 1로 만들어야 한다. (위 하늘색 eigenvector)

→ 위 그림과 같이 구하면, PC1의 1 unit vector는 x-axis의 0.97 파트 + y-axis의 0.242 파트를 포함한, singular vector, 또는 PC1의 eigenvector라고 말할 수 있다. (이 축 각각의 proportion 0.97, 0.242는 loading scrores라 부름)

→ 여기서 best fitting line으로 PC1을 구했을 때의 위 SS를 PC1의 eigenvalue라고 한다.
→ 이 eigenvalue의 root값을 PC1의 singular value라고 함
(실제 PCA 과정에서는 반대로 ③과정인 eigenvector, eigenvalue를 구하는 과정을 통해 ②과정인 best fitting line, 즉 PC1을 구한다)

④ 구한 PC1 line과 perpendicular(수직)한 PC2를 구한다


→ PC1과 수직인 축이 PC2이다 (서로 수직이라는 건 서로 상관관계가 전혀 없음을 뜻한다. 우리는 PC 축들을 각각 수직으로 설정함으로써 서로 영향을 받지 않게 한다. 만약 서로 영향이 있는 PC 축들을 설정하였다면 우리가 원하는 주성분을 고를 수 없게 된다. 주성분이란, 본래 data를 가장 잘 설명하는, 변환된 data의 모임인데 만약 해당 주성분과 영향이 있는 또다른 PC축이 있다면, 즉 정보 중복이 일어난다면 주성분으로 고른 PC가 데이터를 가장 잘 설명하는 PC라고 말할 수 없기 때문!

→ 위 그림에서 보듯이 해당 data에 대해 가장 잘 설명하는 PC1(first principal component)을 구했고, 이와 함께 PC1에 수직인 PC2(second pc)까지 시각화했다.


⑤ PCA plot & variation


→ 이제 구한 PC1과 PC2(해당 case는 2D data)를 각각 축으로 하여 data를 다시 재정렬할 수 있다. (PCA plot 위 참조)

→ 이제 각 PC 축들의 variation을 구해보면..
≫ variation PC1 = $\cfrac{SS(PC1)}{n-1}  =  a$
≫ variation PC2 = $\cfrac{SS(PC2)}{n-1} = b$

→ 총 variation값(total variation around both PCS)은 a+b가 나온다.

→ 여기서 PC1은 전체 data의 variation 중 (a/(a+b))*100(%)의 확률을 차지하고 있으며, PC2는 (b/(a+b))*100(%)의 확률로 차지하고 있다.


⑥ scree plot 시각화 (예시 및 code는 하단 참조)

→ 각 PC축이 전체 variation의 몇% 씩을 차지하는 지 나타내 주는 시각화 그래프이다.
→ 해당 그래프를 통해 우리는 몇 개의 PC만 가져갈 것인지 feature extraction을 진행할 수 있다!

 

(★ PCA가 feature extraction인 이유 - 본래 가진 data 자체에서 feature를 select하는 게 아니라, 본래 가진 data를 PC축으로 변환하는 과정이기 때문에 기존 data를 변형한, feature extraction이다 - 그리고 새롭게 생긴 PC축들을 기준으로, 변형된 data를 가지고 후의 과정을 진행한다)

(+) 만약 3개 이상의 variable이 관여한 PCA라면, PC3를 고를 때는 기존 앞의 PC1과 PC2 모두에 각각 수직인 PC3를 골라야 한다. 즉, 새로운 PC축을 고른 다는 것은, 앞서 만든 모든 PC축들에 각각 수직이어야 한다는 점


* REAL PCA internal computational steps>

* 먼저 위에서 배운 PCA를 covariance matrix, eigenvector 개념을 넣어서 순서를 깔끔하게 다시 정리해보면..! (좋은 글 발췌!)

① standardization


🌞 기존 data에서 standardization 과정을 꼭! 거쳐야 한다. 기존 data의 경우 range 범위가 매우 넓은 data라면 상대적으로 크기가 큰 data에 큰 영향이 가며, 크기가 작은 data 효과는 미미한 경우가 많으므로 정확한 feature extraction을 위해, 그리고 후에 있을 covariance matrix에서 단순히 크기에 따른 covariance의 변화 영향을 없애기 위해(하단 그림 참조) 미리 data를 standardize한다.

🌞 $z = \cfrac{value - mean}{standard deviation}$ (z는 standardized된 결과)


(+) covariance scale 문제점

② covariance matrix computation

→ PCA에서 우리는 주어진 data가 얼마나 평균으로부터 각각 서로 잘 떨어져있는지, 즉 각 axis별로 서로의 관계가 있는 지 알고 싶다. 

각 axis별 = variable별로 서로 얼마나 관계성이 있는 지 알아보기 위해서는 covariance matrix를 참조한다.

→ 위와 같이 왼쪽 대각선 부분은 각 variable의 variance(분산)이며, 왼쪽 대각선을 기준으로 위쪽과 아래쪽은 대칭이다 (대칭행렬)
(covariance 공분산은 교환법칙 $Cov(x,y) = Cov(y,x)$이 성립하므로)

 

 이 covariance matrix를 통해 우리는 양수값일 경우 두 variable끼리 같이 증가하거나 같이 감소하는 relationship, 음수값일 경우 그 반대로 inversely correlated된 경우임을 알 수 있다.

 

→ covariance matrix는 아래와 같은 식을 통해 구할 수 있다. (code에서는 함수 자체가 따로 있으며, 자세한 수학 증명은 추후 심화 포스팅 참조!)

 

$cov(X) = \cfrac{1}{n-1}X'X'^{T}$

(n은 관측치 전체 개수, $X'$는 input data X를 각 variable 별로 평균을 0을 기준으로 centering 한 행렬 의미)

* covariance matrix 두 가지 성질

① covariance matrix 성질 1) 여기서 공분산 행렬의 대각합(tr(Cov(X)))은 공분산 행렬의 고유값들의 합을 뜻한다. 

$$Variance \; = \sum_{i=1}^{M} Var(X_i)$$

→ 즉, 공분산 행렬의 대각합은 각 axis별 모든 분산의 합이고, 이는 곧 새로운 주축들로 projection될 data의 분산들의 합(고윳값들의 합)과 당연히 같음을 증명할 수 있다. (전체 분산의 크기는 projection을 해도 변하지 않으므로)

 

② covariance matrix 성질 2) covariance matrix는 대칭행렬임을 확인하였고, eigenvector & eigenvalue 포스팅에서 대칭행렬의 고유벡터는 서로 수직임을 확인하였다.

 

→ 즉, 공분산 행렬의 고유벡터, 즉 PC 주축들은 서로 수직임을 행렬의 성질을 통해 증명하였다. (서로 수직인 건 서로 연관성이 0)

③ computing the eigenvectors & eigenvalues of the covariance matrix

(※ to identify the principal components)

 

→ 주축이 되는 결정적인 Principal Component를 알고 싶다면 eigenvector와 eigenvalue값이 무조건! 필요하다

 

covariance matrix에서 eigenvector와 eigenvalue를 계산할 수 있다.

→ eigenvector가 계산되면 이에 따른 eigenvalue가 함께 쌍으로 나온다.
💓 여기서 eigenvector는 data의 variance를 가장 잘 설명해주는 주축 PC1의 방향을 나타내주는 vector이며,

💓 eigenvalue는 해당 eigenvector에 상응하는 eigenvalue로서, 해당 주축 PC1으로 projection된 data의 variance 분산을 나타낸다.

 

(eigenvector, eigenvalue) 한 쌍의 개수는 주어진 data의 dimension number와 동일하다.


→ 위 고유값, 고유벡터 설명에 의해 PCA 개념을 적용하자면, 임의의 행렬 A, 즉 transformation matrix는 covariance matrix이다. 

(covariance matrix의 왼쪽 대각 성분은 각 variable의 variance로, 이는 각 variable별 - 즉 각 axis별 퍼진 정도를 뜻한다. + 그 외의 다른 성분은 두 variable 끼리의 relationship을 나타내는 covariance로, 이는 두 variable - 두 axis 방향으로 함께 퍼진 정도 말한다)

 

→ 즉 위 식 $det(A-\lambda I)\vec{x} = \vec{0}$에서 A에 covariance matrix를 구해 집어넣고 고유값과 고유벡터를 구하면 된다.

(당연히 dimensionality of data에 따라 고유값 및 고유벡터의 개수가 위 방정식의 해의 개수가 된다.)

 

(★👩‍🏫 주의! 왜 covariance matrix의 eigenvector가 해당 Principal Component 축의 방향이 되는 지는 수학적으로 증명이 가능.

따로 자료를 참고할 것! - 이후 심화 포스팅★)

 

→ 고유벡터로 Principal Component의 방향을 찾았다면 A에 의해 $\lambda$배수만큼 해당 축에서 data 분포된 부분까지 커지므로, 즉, data의 분포 배수가 곧 해당 축의 분산 variance이며, 이는 고유값이라고 할 수 있다!

(즉, 고유값은 해당 고유값에의 고유벡터가 원래 데이터에 존재하는 분산을 설명하는 정도)

④ list the eigenvalues in order and compute the prcentage of variance(information)

+ feature vector

 

ex) 예를 들어 아래와 같은 고유값과 고유벡터를 구했다고 하면

 

→ 고유값 $\lambda_1$이 $\lambda_2$에 비해 훨씬 큰 값이며, 전체 $sum of \lambda$ 중 무려 96%나 차지하고 있기에 해당 input data는 주축 PC1인 한 차원으로만 줄일 수 있다. (feature extraction이자 feature reduction의 효과!)

 

→ 따라서 우리는 해당 예시의 경우 $v_1$ eigenvector만으로 feature vector를 구성할 수 있다.

(※ feature vector는 특성을 보여주는 vector의 모음으로, 최종적으로 주축으로 고른 eigenvector만 모인 vector 모음, 즉 matrix of eigenvector compilation이다)

⑤ recast the data along the Principal Component axes

 

→ 이제 원하는 feature vector를 찾았으니, 원래의 original data를 feature vector에 projection하여 data reduction을 진행하자

$FinalDataSet = FeatureVector^{T} * StandardizedOriginalDataSet^{T}$

(원래의 data는 standardization 과정을 거치고 난 뒤의 data이다)

 

→ cast된, 즉 변환된 data는 그 자체로 해석이 불가능하며, 의미를 갖고 있지 않은 data이다. 그저 data extraction이자 data reduction 목적에 맞게 해당 data를 낮은 차원으로 바꿨을 뿐, 이후 가공하거나 분석하는 데 더 쉬울 뿐이지, data 자체에서 인사이트를 뽑아내기에는 무리가 있다.

→ cast된 data는 '원래 관측치가 선택된 주성분으로 표현되는 축에 대해 갖는 원점으로부터의 길이', 즉, '원래 관측치가 주성분축에 대해 갖는 투영벡터(projection vector)의 길이'

※ 즉, 아래 참고한 그림에서 길이 a를 뜻함 ※

* projection vector 길이 구하기

Q. 주축 PC1 단위벡터를 $\vec{v}$라 하고, 관측치의 원점까지의 벡터를 $\vec{x}$라고 하자. 이 때, 관측치의 원점까지의 벡터와 PC1 단위벡터 사잇각을 $\theta$라 하면, PC1에 투영한 projection vector의 길이를 구해라.

 

A. 

① 사잇각 $\theta$ 사용

$$cos\theta = \frac{|\vec{x_1}|}{|\vec{x}|}$$

 

② $\theta$를 $\vec{v}$와 $\vec{x}$의 내적으로 사용해서도 표현

$$cos\theta = \frac{\vec{x}\bullet \vec{v}}{|\vec{x}||\vec{v}|}$$

 

③ ①과 ②를 연립하면

$$|\vec{x_1}|=|\vec{x}|cos\theta = |\vec{x}|\;\frac{\vec{x}\bullet \vec{v}}{|\vec{x}||\vec{v}|}$$

 

④ $|\vec{v}| = 1$이므로 정리하면

$$\therefore |\vec{x_1}| = \vec{x}\bullet \vec{v}$$

 

→ cast된 data는 단순히 원래의 data를 가장 베스트 각도에서 바라볼 수 있는 쪽으로 바꿔주었을 뿐이라는 걸 명심하자!

 

- 정리 🙌-

 

📌 우리가 배웠던 PCA는 애초에 labelling이 되지 않은 data를 가지고 차원을 줄이는 unsupervised data compression technique이다

 

📌 이미 답을 알고 있는 data, 즉 supervised data reduction technique의 경우 Linear Discriminant Analysis(LDA) 기법을 사용

 

📌 이렇게 선형의 형태로 reduction하는 형태가 아닌, non-linear data reduction techniqueKernel Principal Component Analysis(KPCA)기법을 사용한다

(LDA, KPCA 추후 포스팅 예정!)

 

- PCA 개념 완료! -


* 썸네일 출처) https://www.researchgate.net/figure/An-example-of-principal-component-analysis-PCA-for-a-two-dimensional-data-set_fig2_344399773

* 내용 그림 출처) https://bradleyboehmke.github.io/HOML/pca.html

* 출처1) PCA 설명 유툽 https://www.youtube.com/watch?v=g-Hb26agBFg 
* 출처2) PCA - STATQUEST😎 https://www.youtube.com/watch?v=FgakZw6K1QQ 
* 출처3) PCA 예시- breast data https://www.datacamp.com/tutorial/principal-component-analysis-in-python

* 출처4) PCA 공분산 행렬 관련 설명 https://angeloyeo.github.io/2019/07/27/PCA.html

* 출처5) PCA step-by-step https://builtin.com/data-science/step-step-explanation-principal-component-analysis
* 출처6) PCA axis perpendicular - https://gentlej90.tistory.com/15

* 출처7) 대학원 사전교육 <데이터분석을 위한 기초수학>

 

'Machine Learning > Fundamentals' 카테고리의 다른 글

Unsupervised Learning  (0) 2022.06.03
PCA(w/code)  (0) 2022.05.31
Feature Selection vs. Feature Extraction  (0) 2022.05.18
feature selection (1) - selectKBest (+jointplot)  (0) 2022.04.20
Ordinal Encoding  (0) 2022.04.20

댓글