PCA를 공부해보자. 사실 이 포스팅은 내가 한 2주 전에 써보려고 했었는데 뭔가 잘 안써져서 헤매고 있다가 지금 다시 정리되서 다시 쓰려고 한다. 우선 가장 헷깔렸던 부분이 eigenvalue와 eigenvector의 기하학적인 해석이랄까.. eigenvalue와 eigenvector를 구할 줄은 아는데 뭔가 기하학적으로 그것이 무엇을 의미하는지 왜 의미가 있는지가 잘 이해가 안 됐다.


이번 포스팅에서는 eigenvalue와 eigenvector의 기하학적인 의미를 설명하고 그것이 PCA와 어떤 관계가 있는 것인지를 설명하려고 한다.


우선 eigenvalue와 eigenvector에 대해서 기하학적으로 잘 이해해보자. 우리가 어떤 vector 하나가 있을 때 이것을 행렬로 distort시킬 수 있다.

vector b는 vector v를 A라는 행렬을 통해 왜곡시킨 vector이다. A를 통해서 [1,3]이 [-1, 5]로 왜곡되었다. 그런데 vector 중에는 A를 거쳐도 왜곡되지 않는 그런 vector들이 있다. 이것이 eigenvector이다. eigenvector는 A를 거쳐도 크기만 바뀔 뿐 방향은 그대로이다. 이것이 기하학적으로 갖는 의미는 이와 같다. 아래와 같이 특정 공간 안에 무수히 많은 vector들이 있다고 해보자. 이 공간을 어떤 행렬을 통해 왜곡을 시켰을 때, 다른 vector들은 방향이 변하는데, 방향이 변하지 않는 vector 즉 eigenvector들이 있다. 아래의 그림에서 파란색 보라색이 eigenvector들이다.

출처 : https://deeplearning4j.org/eigenvector


eigenvector의 방향이 결국 어떤 행렬이 공간을 왜곡시키는 방향이다. 즉 공간이 왜곡되는 가장 Principal한 방향이라는 것이다. 제일 처음에 예로 든 Matrix A를 놓고 봐보자. 우선 A의 eigenvalue eigenvector를 구하면 다음과 같다.


2개가 나온다. 하나는 u=[1/sqrt(2), -1/sqrt(2)] 다른 하나는 v=[1/sqrt(2), 1/sqrt(2)]이다. u의 eigenvalue는 3이고 v의 eigenvalue는 -1이다. 즉 u가 가장 크게 A를 왜곡시키는 방향이라는 것이다. 그러면 v는 무엇인가? A는 v방향으로도 왜곡을 시키기는 한다. 그런데 u방향만큼은 아니라는 것이다. u와 v를 봤을 때, 두 vector는 수직이다. 그렇다. 모든 eigenvector들은 서로 수직이다. 마치 이렇게 놓고 볼 수 있다.

위와 같이 데이터가 x축 방향으로 놓여있다. 그런데 각각의 데이터가 y방향도 있기는 하다. 그래서 y축도 있는데, x축과 y축은 수직이다. 즉 우리가 머리속에 x축 y축을 그리는 개념이 eigenvector와 비슷하다는 것이다. 다만 한가지 추가된 것이 있다면 각각의 eigenvector가 상응하는 eigenvalue를 가진다는 것 정도이다.


자 eigenvalue와 eigenvector의 기하학적인 의미는 이제 충분히 알아본 것 같다. 그럼 이제 PCA를 설명해보자. PCA는 multi-dimension 데이터에 대해서 eigenvalue와 eigenvector를 구해서 데이터가 흩어져있는 공간의 가장 principal한 방향들을 구하는 것이다. 또 그 방향을 구하면 그에 상응하는 크기인 eigenvalue를 같이 구하게 되는데 그로 인해 데이터들이 어떤 방향으로 얼만큼 중요도를 가지고 있는지를 알 수 있게 된다.


PCA를 실제로 어떻게 구하는지 예제 데이터로 설명해보자. 우선 아래와 같은 데이터가 있다고 해보자.


여기서 중요한 개념이 있는데 우리는 이 데이터를 바로 사용하지 않는다는 것이다. 우리는 이 데이터의 covariance matrix를 구해서 그것에 대하여 eigenvalue eigenvector를 구할 것이다. (eigenvalue와 eigenvector는 반드시 nxn matirx에서만 구할 수 있다.)


위에 주어진 데이터는 10x4 matrix이다. 이것의 covariance matrix C를 구하면 우리는 4x4 matrix를 구할 수 있다.


여기서 4x4 covariance matrix C와 이것의 eigenvector간의 관계를 잘 생각해보자.


L1v1은 c11, c12, c13, c14에 의해 결정된다. 만일 c11이 무지 크고 c12, c13, c14가 무지 작은 숫자라면 결과적으로 L1v1은 c11에 의해서 가장 크게 결정된다는 이야기이다. 이 얘기는 무엇이냐? c11은 covariance matrix에서 dimension1의 covariance이고, c12, c13, c14는 각각 dimension2,3,4와의 covariance인데, c12, c13, c14가 작은 숫자라는 말은 dimension1-dimension2, dimension1-dimension3, dimension1-dimension4의 관계는 거의 없다는 말이다 서로서로 랜덤이라는 말이다. 이것이 우리가 covariance matrix를 구해야 하는 이유이다. covariance matrix를 구함으로서 우리는 각각의 dimension이 서로 다른 dimension과 갖는 정도를 숫자로 표시할 수 있다. (covariance)


따라서 covariance matrix C의 eigenvalue와 eigenvector를 구한다는 의미는 C가 왜곡시키는 공간의 방향을 알아보겠다는 의도가 된다. 그리고 왜곡된 vector들은 covariance matrix의 각 원소에 의해 영향을 받는 것이다.


지금까지 이해한 내용을 살짝 정리해서 PCA를 구하는 식을 한번 구해보자.

(단, A는 데이터를 통해서 구한 Covariance Matrix이며, [v11, v12, v13, v14]가 eigenvalue 람다1에 대한 eigenvector이다.)


여기서 V는 eigenvector들이며 이들은 서로 orthonormal하기 때문에 V의 역행렬은 V의 Transpose와 같다. 따라서 최종식은 아래와 같다.


실제로 맞는지 위의 10x4 데이터를 바탕으로 확인해보자. 10x4 데이터의 Covariance Matrix의 eigenvalue와 eigenvector를 구해서 위의 식대로 계산을 해보면 실제로 아래와 같이 원래의 Covariance Matrix가 나온다.


만일 우리가 이 데이터를 4차원이 아닌 2차원으로 줄이려면 어떻게 해야할까? 4차원 데이터이니까 우리는 eigenvector, eigenvalue가 각각 4개씩 있다. 4차원에서 2차원으로 줄이려면 가장 큰 eigenvalue 2개에 해당하는 eigenvector를 원본 데이터와 행렬 곱해주면 된다. 즉 가장 큰 eigenvalue 2개에 해당하는 eigenvector 2개를 원본 데이터와 곱하면 아래와 같이 된다.


(10x4) x Transpose(2x4)

(10x4) x (4x2) = (2x10) = Net Data


(2x4) 행렬은 가장 큰 eigenvalue 2개에 해당하는 eigenvector 2개를 의미하고

(10x4) 행렬은 원본 데이터를 의미한다. 행렬 곱셈을 해주기 위해서 2개의 eigenvector 행렬의 Transpose를 구해서 원본 데이터 행렬 뒤에 곱해주면 차원이 줄어든 새로운 행렬이 된다. 이 때 우리는 eigenvalue가 가장 큰 2개의 eigenvector를 구해서 곱해줬기 때문에 데이터의 Variance 손실을 최소화해줄 수 있으면서 차원은 줄일 수 있게 된다.


자 이제 지금까지 설명한 원리를 바탕으로 PCA를 구하는 과정을 생각해보자.

1. multi dimension 데이터를 준비한다.

2. 해당 multi dimension 데이터의 covariance matrix를 구한다.

3. covariance matrix의 eigenvalue, eigenvector를 구한다.

4. 줄이고 싶은 dimension만큼의 eigenvector를 원본 데이터에 matrix dotproduct을 구한다.


원래 더 자세하게 PCA를 쓰려면 원래 데이터 복구도 해야되는데 그냥 여기까지 하려고 한다. 원래 데이터 복구하는 부분은 식을 생각해보면 별로 어렵지는 않은 부분이기 때문이다.

Posted by 빛나유
,