본문 바로가기
머신러닝, 딥러닝/Dimension Reduction

[ML] 주성분 분석(PCA)

by Deeppago 2022. 2. 27.

1. PCA(Principal Component Analysis) 개요

PCA는 가장 대표적인 차원 축소 기법이다. PCA는 여러 변수 간에 존재하는 상관관계를 이용해 이를 대표하는 주성분(Principal Component)을 추출해 차원을 축소 하는 기법이다. PCA로 차원을 축소할 떄는 기존 데이터의 정보 유실이 최소화 되도록 차원을 축소한다. 이를 위해서 PCA는 가장 높은 분산을 가지는 데이터의 축을 찾아 이 축으로 차원을 축소하는데 이것이 PCA의 주성분 분석이 된다. 즉 분산이 데이터의 특성을 가장 잘 나타내는 것으로 간주하는 것이다. 

 

100명의 학생들이 국어 시험과 영어 시험을 봤다고 생각해보자.

영어 시험이 조금 더 어려웠고 그 결과 중 일부는 대략적으로 다음과 같았다고 하자.

 

국어 점수 영어 점수
100 83
70 50
30 25
45 30
80 60

 

국어 성적을 \(x\) 축에, 영어 성적을 \(y\) 축에 놓고 데이터를 시각화하면 다음과 같다.

 

 

만약 여기서 국어와 영어의 ‘종합 점수’를 만들고자 한다면 어떻게 하는 것이 좋을까?

가장 먼저 생각나는 방법은 두 점수의 평균을 취하는 것이다. 하지만, 또 다른 방법으로는 영어 시험이 상대적으로 더 어려웠으므로, 국어 대 영어 점수를 6:4로 비중을 두고 더할 수도 있다.

여기서, 평균을 취해 종합 점수를 낸다는 것과 6:4의 비중으로 종합 점수를 낸다는 것을 수학적으로 표현하면 어떻게 될까?

예를 들어, A라는 학생의 국어 성적, 영어 성적이 100점, 80점 이었다고 하자.

그렇다면, 5:5의 비율로 평균을 낸다는 것은 아래와 같고

 

\[100 \times 0.5 + 80\times 0.5\]

 

 6:4의 비율로 종합 점수를 낸다는 것은 아래와 같다.

 

\[100 \times 0.6 + 80\times 0.4\]

 

첫번째 식은 (100,80) 벡터를 벡터와 내적한 것이고, 두 번째 식은  벡터를 (0.6,0.4) 벡터와 내적한 것이라고 할 수 있다.

 

즉, 종합 점수를 얻을 때, 5:5의 비율 혹은 6:4의 비율로 종합 점수를 얻는 방식은 수학적으로는 점수 벡터를 특정 비율을 표현하는 벡터에 내적(즉, 기하학적으로는 정사영) 하는 문제로 환원해 생각할 수 있다.

그렇다면 우리가 고민해야 할 핵심 문제는 이것이다.

  • 데이터 벡터를 어떤 벡터에 내적(혹은 정사영)하는 것이 최적의 결과를 내주는가?

부차적으로 생각해볼 것은,

  • 정사영 할 벡터(혹은 축)을 찾는데, 데이터 분포의 중심을 중심축(pivot)으로 움직이는 벡터를 찾는게 좋지 않을까?

이 문제에 대한 해결책은 ‘데이터의 구조(혹은 형태)’를 기술하는 수학적인 방법인 공분산 행렬로부터 찾을 수 있다.

 

PCA를 선형 대수 관점에서 해석해 보면, 입력 데이터의 공분산 행렬(Covariance Matrix)을 고유값 분해하고, 이렇게 구한 고유 벡터(eigenvector)에 입력 데이터를 선형 변환하는것이다. 이 고유벡터가 PCA의 주성분 벡터로서 입력 데이터의 분산이 큰 방향을 나타낸다. 고유값(eigenvalue)은 이 고유 벡터(eigenvector)의 크기를 나타내며, 동시에 입력 데이터의 분산을 나타낸다. 

참고 : 고유값(EigenValue)과 고유 벡터(Eigen Vector)

 


2. 공분산 행렬의 의미

보통 분산은 한 개의 특정한 변수의 데이터 변동을 의미하나, 공분산은 두 변수 간의 변동을 의미한다. 즉, 사람 키 변수를 X, 몸무게 변수를 Y라고 하면 공분산 Cov(X, Y) > 0 은 X(키)가 증가할 때 Y(몸무게)도 증가한다는 의미이다. 공분산 행렬은 여러 변수와 관련된 공분산을 포함하는 정방형 행렬이다. 

 

  X Y Z
X 3.0 -0.71 -0.24
Y -0.71 4.5 0.28
Z -0.24 0.28 0.91

 위 표에서 보면 공분산 행렬에서 대각선 원소는 가 변수(X, Y, Z)의 분산을 의미하며, 대각선 이외의 원소는 가능한 모든 변수 쌍 간의 공분산을 의미한다. 

 


3. 고유벡터와 고유값

공분산 행렬은 정방행렬(Diagonal Matrix)이며 대칭행렬(Symmetric Matrix)이다. 정방행렬은 열과 행이 같은 행렬을 지칭하는데. 정방행렬 중에서 대각 원소를 중심으로 원소 값이 대칭되는 행렬, 즉 \(A^T = A\)인 행렬을 대칭행렬이라고 부른다. 공분산 행렬은 개별 분산값을 대각 원소로 하는 대칭행렬이다. 이 대칭행렬은 고유값 분해와 관련해 매우 좋은 특성이 있다. 대칭행렬은 항상 고유벡터를 직교행렬(orthogonal matirx)로, 고유값을 정방 행렬로 대각화 할 수 있다는 점이다.

 

고유 벡터는 행렬 A를 곱하더라도 방향이 변하지 않고, 그 크기만 변하는 벡터를 지칭한다. 즉 Ax = ax(A는 행렬, x는 고유벡터, a는 스칼라값)이다. 이 고유벡터는 여러 개가 존재하며, 정방행렬은 최대 그 차원 수만큼의 고유벡터를 가질 수 있다. 이렇게 고유 벡터는 행렬이 작용하는 힘의 방향과 관계가 있어 행렬을 분해하는데 사용된다.

 

입력 데이터의 공분산 행렬을 \(C\)라고 하면 공분산 행렬의 특성으로 인해 다음고 같이 분해할 수 있다.

 

\[C = P\sum P^T\]

 

이때 \(P\)는 \(n \times n\)의 직교행렬이며, \(\sum \)는 \(n \times n\)의 정방행렬, \(P^T\)는 \(P\)의 전치 행렬이다. 위 식은 고유벡터 행렬과 고유값 행렬로 다음과 같이 대응된다.

 

\[C = \begin{bmatrix} e_1&...&e_n \\\end{bmatrix}\begin{bmatrix}\lambda_1 &...&0\\...&...&...\\0&...&\lambda_n\\\end{bmatrix}\begin{bmatrix}e_1^t\\...\\e_n^t\\\end{bmatrix} \]

 

즉, 공분산 \(C\)는 고유벡터 직교 행렬*고유값 정방 행렬*고유벡터 직교 행렬의 전치 행렬로 분해 된다. 

참고 : 고윳값 분해

 

정리하자면 PCA는 입력 데이터의 공분산 행렬이 고유 벡터와 고유값으로 분해될 수 있으며, 이렇게 분해된 고유벡터를 이용해 입력 데이터를 선형 변환하는 방식이다. 보통 PCA는 다음과 같은 과정으로 수행된다.

  • 입력 데이터 세트의 공분산 행렬을 생성한다.
  • 공분산 행렬의 고유벡터와 고유값을 계산한다.
  • 고유값이 가장 큰 순으로 K개(PCA 변환 차수만큼)만큼 고유벡터를 추출한다.
  • 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환한다.

댓글