What is PCA?
Principal Component Analysis (PCA)는 차원을 축소하는 unsupervised learning이다. 기법의 이름을 보면 유추할 수 있듯, PCA는 component feature만 남기고 다른 특징들을 제거해 차원을 축소한다.
만약 특징의 수가 매우 많을 때, 단순히 시각화만으로 데이터를 분석하기에는 한계가 있다. 따라서 어떤 특징이 가장 주요한 (component)지를 밝혀내어 dimension reduction, 즉 특징의 수를 줄이는 작업이 필요하다. PCA는 가장 큰 분산을 갖는 특징이 가장 주요한 특징이라는 사실을 이용한다. 큰 분산을 갖는 특징일수록 데이터를 더 많이 설명한다는 intuition이다. 즉, 높은 분산을 갖는 특징은 더 중요한 특징이고 작은 분산을 갖는 특징은 덜 중요한 특징이라는 관계가 성립한다.
PCA는 단순히 기존의 특징들 중에서 가장 주요한 것들을 선택하는 것이 아니라, 기존의 특징들을 특정 비율로 적절히 조합하여 완전히 새로운 특징 z를 만들어낸다. 기존의 특징을 f1, f2, f3...이라고 한다면 PCA는 new feature z = af1 + bf2 + cf3 +....를 만들어낸다. 만약 f1이 f2, f3에 비해 상대적으로 중요한 특징이라면 new feature z에서 큰 부분을 차지할 것이다. 즉, a가 b, c에 비해 클 것이다. z를 구하는 식을 보면 알 수 있듯, PCA는 기존 특징들의 linear transformation을 통해 새로운 (주요한) 특징을 만든다. 이때, 가장 큰 분산을 갖는 특징을 principal component라고 한다.
아래 그림에서 feature 1을 f1, feature 2를 f2라고 하고 다음과 같은 데이터 분포가 있다고 해보자. 검은색 축이 바로 PCA가 만드는 new feature z = af1 + bf2이며, z는 가장 큰 분산을 가지는 principal component이다.

principal component를 찾은 다음, 그 축으로 데이터들을 모두 투영시킨다. 즉, 2D 데이터를 1D 데이터로 차원을 축소시킨 것이다. 그러나 PCA를 통해 차원을 축소시키면 기존 데이터의 일부 특징을 손실한다는 한계가 있다. 원본 데이터를 봐 보자. 물론 principal component 축이 데이터의 특징을 가장 잘, 많이 설명하기는 하지만, 그 축으로 데이터를 투영시키면 이제는 principal component 축과 수직 방향에 존재하던 데이터의 특징 (빨간색 축 방향의 특징)이 모두 사라진다. 따라서 PCA는 특징들의 개수는 많지만 그 중에서 실제로 주요한 특징은 소수일 경우에 유용하다.

여기까지 theory and intuition이었고, 이제 PCA를 수학적으로 생각해보자.
PCA Math
PCA를 이해하기 위해서는 eigenvector와 eigenvalue라는 선형대수 개념을 알아야 한다.
eigenvector (고유 벡터)는 어떤 벡터 x에 행렬 A를 이용한 선형 변환을 한 후에도 그 방향이 변하지 않는 벡터를 의미한다. Ax = \(\lambda\)x를 만족하는 x를 고유 벡터라고 한다. 즉, A를 통한 선형 변환 이후에도 크기는 바뀌어도 (\(\lambda\) 그 방향은 바뀌지 않는 벡터를 의미한다. 이때 고유 벡터에 대응되는 eigenvalue (고유값)은 \(\lambda\)이며, 고유값은 고유 벡터가 설명하는 분산 (explained variance)를 나타낸다. 즉, 가장 큰 고유값을 가지는 고유 벡터가 새로운 축인 principal component가 되는 것이다. 아래는 PCA의 과정이다.
1. 특징들의 covariance matrix (공분산 행렬)를 구한다. covariance (공분산)은 특징 사이의 상관관계를 의미한다. 공분산이 양수이면 어떤 특징 x가 증가할 때 특징 y도 증가함을, 음수이면 x가 증가할 때 y를 감소함을 의미한다. 부호에 상관 없이 공분산의 절대값이 크면 상관관계의 강도가 강하다는 것이다. 만약 특징 x와 y가 있다면, x와 y의 공분산 행렬은 아래와 같다.




2. 공분산 행렬의 고유 벡터와 고유값을 계산한다. 공분산 행렬 Cov(x, y)를 행렬 A로 두어 Cov(x, y)v = \(\lambda\)v의 식을 이용한다. (Cov(x, y) - \(\lambda\)\(I\))v = 0으로 정리 가능하며, Cov(x, y) - \(\lambda\)\(I\) 행렬의 determinant를 0으로 만드는 값이 고유값이다. 이때 고유값은 여러 개가 나올 수 있는데, 각 고유값에 대응되는 벡터 v를 구해준다. 그 중 가장 큰 고유값에 대응되는 고유 벡터가 데이터의 새로운 축인 principal component가 된다.
3. 데이터를 principal component 축으로 투영시킨다. X는 원래 데이터, \(\mu\)는 각 feature의 평균, V는 고유 벡터이다.

아래 그림은 고유값이 고유 벡터의 분산이라는 설명을 보여준다. 가장 큰 고유값인 \(\lambda_1\)이 빨간색 고유 벡터의 분산이고 그 다음으로 큰 고유값인 \(\lambda_2\)가 파란색 고유 벡터의 분산이다. 이때, 모든 고유 벡터끼리는 서로 직교 (orthogonal)한다. 첫 번째 고유 벡터는 데이터의 가장 큰 분산 (maximum variance)을 설명하고, 두 번째 고유 벡터는 첫 번째 고유 벡터가 미처 설명하지 못한 나머지 분산 (maximum residual variance)을 가장 잘 설명한다.

고유값의 특징에 대해 더 논의해보자. 만약 특징끼리 높은 상관관계를 가진다고 해보자. 즉, 공분산 행렬에서 주대각 성분을 제외한 나머지 부분의 값들의 절대값이 상당히 크다는 것이다. 그렇다면 Cov(x, y) - \(\lambda\)\(I\) 행렬의 고유값들은 대부분 0에 수렴할 것이다. 그 이유는 2 x 2 행렬의 고유값은 주대각성분끼리의 곱에서 나머지 성분의 곱을 뺀 값을 0으로 만드는 값이기 때문이다. 주대각성분은 자기 자신과의 상관관계이기 때문에 큰 값을 가지고, 만약 서로 다른 특징끼리 높은 상관관계를 가진다고 하면 그 값 역시 큰 값을 가진다. 예시를 들어보자. 2 x 2 행렬의 주대각성분을 각각 m1, m2라고 하고 나머지 값을 c1, c2라고 해보자. 즉, Cov = [m1 c1 \n c2 m2]이다. Cov(x, y) - \(\lambda\)\(I\) = [m1 - \(\lambda\) c1 \n c2 m2 - \(\lambda\)], 이 행렬의 determinant = (m1 - \(\lambda\))(m2 - \(\lambda\)) - c1c2 = 0, 식을 정리하면 (m1 - \(\lambda\))(m2 - \(\lambda\)) = c1c2를 만족하는 \(\lambda\)를 찾아야 한다. 따라서 특징 사이의 상관 관계 c1, c2가 m1, m2 못지 않게 크다면 \(\lambda\)는 0에 수렴할 것이라는 이야기가 된다.
'머신러닝' 카테고리의 다른 글
| [선형 대수] 기저 (basis), 랭크 (rank) (0) | 2025.01.18 |
|---|---|
| [데이터 사이언스] 개선 (0) | 2025.01.10 |
| [패턴 인식 코드 개선] 개선 (0) | 2025.01.06 |
| [패턴 인식 코드 개선] Bayesian Optimization (0) | 2025.01.06 |
| [머신 러닝] SVM (Support Vector Machine) (0) | 2024.12.24 |