정말 많이 쓰이는 머신러닝 기법이지만 이해하기 어려운 주성분 분석(PCA; principal component analysis)에 대해 설명해본다.
이 글은 고윳값 분해(eigen decomposition) 또는 특이값 분해(SVD; singular value decomposition)를 아는 사람에게 수준이 맞춰져 있음을 미리 밝힌다.
주성분 분석은 데이터의 주성분을 찾는 방법이다. 데이터의 주성분은 데이터들의 분산이 가장 큰 벡터다.
쉽게 말하자면, 기존 단위 벡터로는 설명이 잘 안 되니까 축을 틀어서 더 좋게 설명해보자는 것이고, 그 축을 분산이 가장 큰 벡터로 잡는 것이다.
이를 위해선 먼저 분산이 가장 큰 벡터를 찾아야 한다. 이를 위해 데이터들의 공분산 행렬을 구한다. 물론 여기서 데이터의 중심점을 원점으로 맞추고 scaling도 하는 작업이 동반된다. 이유는 아주 간단하게도 계산하기 편하게 하기 위해서다.
공분산 행렬은 고차원에서의 분산 데이터를 나타낸 것이다. 이제 이 행렬에서 분산이 큰 순서대로 벡터를 찾아야 한다.
이때 사용되는 것이 바로 eigen decomposition 또는 SVD다. 여기서는 SVD로 설명한다. 이유는 SVD가 eigen decomposition의 일반형이기 때문이다.
이 포스트에서는 $ m $과 $ n $은 각각 데이터 수와 특징(feature) 수로 정의한다. 참고로 이 부분은 개인이 정하기 나름이며, 주로 데이터 수인 $ m $이 feature 수인 $ n $보다 월등히 높고, $ m>n $일 때를 설명할 때 사용하므로 이렇게 정의한다.
SVD는 $ m×n $ 행렬인 $ M $을 $ m×m $ 정방 행렬 $ U $, $ m×n $ 대각 행렬 $ \Sigma $와 $ n×n $ 정방 행렬인 $ V^* $로 분해하는 것이다. 여기서 $ ^* $는 켤레 전치(conjugate transpose) 또는 에르미트 전치(Hermitian transpose)로 불리며, 전치와 켤레 복소수를 동시에 취해준다. 올림자에 $ ^* $ 이외에도 $ ^H $를 쓰기도 한다. 전치(transpose)의 일반적인 표현이다.
여기서 나오는 $ U $는 $ MM^T (m×m) $의 eigenvector를 모은 행렬이고, $ V^* $의 뜻은 $ M^TM (n×n) $의 eigenvector를 모은 행렬이다.
앞서 언급한대로 $ m $과 $ n $을 각각 데이터 수와 특징(feature) 수로 정의한다면, 특이값 분해의 결과인 $ U \Sigma V^* $에서 $ \Sigma $와 $ V^* $를 사용한다. 이 둘이 주성분 분석에서 써먹을 애들이기 때문이다. 데이터 행렬의 eigenvector는 주성분 분석에서 쓸 일이 없다.
잠깐 사족이지만, 여태까지 eigen decomposition를 봐왔다면 $ Ax = \lambda x $라는 수식에 익숙할 것이고, 항상 eigenvector는 오른쪽에만 있다고 아는 사람들이 많을 것이다. 하지만 이는 명백한 오해이며, 왼쪽으로 붙는 eigenvector도 존재한다! 이를 left eigenvector라고 부르며, $ w^TA = w^T \lambda $처럼 사용한다. $ Ax = \lambda x $ 일 때는 당연하게도 right eigenvector라고 부른다. 단지 많이 쓰이기 때문에 right를 생략했을 뿐이다.
여기서 eigenvalue와 eigenvector의 성질을 알아야 한다.
$ Ax = \lambda x $
Eigen decomposition을 생각해보면 떠올리는 대표적인 수식이다. 하지만 단지 저 수식만을 보면 eigen decomposition의 정의를 쉽게 떠올리긴 어렵다.
다들 알다시피 eigen decomposition이 존재하려면 $ (A - \lambda I)x = 0 $에서 $ det(A - \lambda I) = 0 $이 되어야 한다. 그래야 $ x $가 zero vector가 되지 않기 때문이다. 또한 eigen decomposition을 하기 위해서는 $ A $가 정방 행렬 이어야 한다. 그리고 decomposition 이후 나오는 모든 eigenvector들은 orthogonal하며 그렇기에 basis로 사용할 수 있다. 이 부분은 eigen decomposition을 배운다면 알 수 있는 기초라 추가적인 설명은 하지 않는다.
만약 $ A $가 $ r×r $이라면, eigenvector와 eigenvalue는 총 $ r $개 나온다. 그리고 각각의 eigenvector들은 orthogonal하다. 그렇기에 $ A $에 하나의 eigenvector를 곱한다면 다른 $ r-1 $개의 eigenvector들의 성분은 다 죽어버린다! 이 부분이 이해가 안 간다면 orthogonal 성질에 대해서 알아보기 바란다.
그렇기에 위의 수식인 $ Ax = \lambda x $의 설명이 더 쉬워진다. 행렬 $ A $에서 eigenvector $ x $를 곱하면 그 eigenvector의 성분만이 남는다. 그리고 eigenvalue $ \lambda $와 eigenvector $ x $가 곱해진 것이 우변에 있다. 이 뜻은, 행렬 $ A $에서 eigenvector $ x $를 곱했을 때 기존의 $ x $가 eigenvalue $ \lambda $배만큼 변한다는 뜻이다! 조금 더 쉽게 말하자면, eigenvalue $ \lambda $는 해당하는 eigenvector $ x $가 행렬 $ A $에 곱해졌을 때 이 벡터가 얼마만큼의 영향을 받는지 알려주는 상수다.
즉, 위의 $ Ax = \lambda x $를 $ A $가 $ n \times n $일 때 $ Ax_{i} = \lambda_{i} x_{i} \; (1 \leq i \leq n) $로 바꾸면 더 이해하기 쉬워질 것이다.
왜 앞서서 eigen decomposition을 알려줬냐 하면, SVD는 eigen decomposition의 일반적인 경우에 해당하기 때문이다.
$ m×n $의 데이터의 공분산 행렬을 SVD 했을 때 나오는 $ n $개의 singular value와 그에 해당하는 feature의 singular vector가 모인 $ n×n $ 정방 행렬인 $ V^* $가 위의 이야기와 딱 들어맞는다.
여기서 feature singular vector는 기존 feature들의 적절한 선형 결합들이고, 각각의 feature singular vector들은 orthogonal하다. 당연하지만 크기가 큰 singular value에 따라 feature singular vector가 나열된다.
이 뜻은, 공분산 행렬 $ M $에서 가장 영향을 크게 받는 feature singular vector들이 singular value의 크기 순으로 나열되어 있다는 뜻이다!
즉, 이 feature singular vector들이 모인 행렬 $ V^* $가 주성분 행렬이 되고, singular value들은 해당하는 주성분들의 크기가 된다.
한 발짝 더 나아가서, 그렇다면 왜 주성분 분석을 통해서 차원 축소(dimension reduce)가 되는지도 알아보자. 앞에 적은 설명이 (아마도 잘) 이해가 되었다면 쉽게 따라올 수 있을 것이다.
앞서 말했다시피, 각 feature들의 singular vector에는 해당하는 singular value가 있고, singular value는 공분산 행렬에서 그 singular vector가 얼마만큼 영향을 받는지를 알려주는 크기다.
그렇다면 이런 생각이 든다. 가장 큰 영향을 받는 eigenvector만 두고 써도 문제가 되지 않을까?
아래의 예시를 함께 두고 보자.
이 예시는 실제로 내가 $ elem×208 $의 데이터를 SVD를 취하여 얻은 208개의 singular value 중 100개 만을 간추린 것이다. 0.006과 0.002에서 중간에 딱 끊긴 부분이 보인다. 그 위로는 큰 singular value가 존재하고, 아래로 갈수록 크기의 차이가 없어진다.
딱 느껴질 것이다! $ y=0.006 $ 또는 $ y=0.002 $ 위에 있는 singular value에 해당하는 singular vector들만으로도 충분히 설명 가능할 것 같다는 것이!
다시 말해, 전체 singular value 합에서 특정 비율 이상의 singular value에 해당하는 singular vector를 사용한다면, 그것이 바로 주성분 분석을 이용한 차원 축소가 되는 것이다.
물론 단점은 존재한다. 적은 feature singular vector만 이용한다는 것은 나머지 feature singular vector를 버린다는 뜻이고, 이는 정보 손실로 이어진다. 어쩔 수 없는 선형 차원 축소의 한계다.
하지만 선형이기에 비선형보다 굉장히 빠르고, 비선형보다는 설명력이 그나마 있다는 장점 때문에 여전히 주성분 분석은 유용하게 쓰인다. 거의 대부분은 주성분 분석으로 차원 축소가 된다면 좋을 수밖에 없다. 물론 주성분 분석으로 좋은 결과가 안 나올 때에는 비선형적 방법을 써야한다.
나중에 다룰 예정이지만, 인공지능 모델 중 오토인코더(autoencoder)가 주성분 분석의 일반적인 경우라는 이야기를 남기며 글을 마무리한다.
궁금한 점이나 잘못된 부분이 있다면 언제든지 댓글 달아주시길 바란다.
'Machine Learning > 차원 축소' 카테고리의 다른 글
[차원 축소] t-분포 확률적 임베딩(t-SNE)을 알아보자 (3) | 2022.08.16 |
---|
댓글