선형대수학에서 배우는 고유값 분해특이값 분해는 참 여기저기에 많이 사용된다. 아마 고유값 분해, 특이값 분해를 각 연구분야에 사용해서 게재된 논문만해도 아마 몇 만개는 될 것이다(훌쩍 넘을 수도 있다). 그만큼 응용가치가 크다. 오늘은 고유값과 고유벡터와 아주 밀접한 관련이 있는 머신러닝 알고리즘을 소개하려고 한다. 바로 주성분분석(primary component analysis; PCA)인데, 이는 상당히 유용하며 그 유용성 덕에 매우 유명한 알고리즘이다. 일반적으로 간단히 PCA라고 부른다. 



 PCA의 대략적 이해


PCA는 입력 데이터의 상관 계수 행렬(correlation coefficient matrix)에 대해 고유값분해를 해주어, 공헌도가 큰 고유값(즉, 상대적으로 큰 고유값들)과 매칭되는 고유벡터들을 찾아서 입력 데이터를 그 벡터들로 투영시킨다. 이 과정에서 공헌도가 작은 고유값과 매칭되는 고유벡터들은 무시된다. 


이러한 방식으로 PCA는 데이터에서 주성분 벡터를 찾아서 데이터의 차원(dimension)을 축소시킨다. 차원을 축소시킴으로 얻을 수 있는 효과는 아래와 같다. 


1) 2차원 또는 3차원으로 축소하면 시각화(visualization)가 가능해진다. 즉, 고차원 데이터를 저차원의 데이터로 축소해서 눈에 보이게 만들 수 있다는 것이다. 그러므로 데이터를 이해하는데 도움이 된다. 

2) 데이터 내에는 노이즈가 첨가되어 있다. 중요하지 않고 오히려 중요한 신호를 가리는 소음들이다. PCA를 적용하면 이러한 노이즈가 어느 정도 제거된다. 

3) 차원이 축소되었으므로 이후 처리해야할 연산량이 줄어든다.



PCA의 수학적 이해


데이터 포인트들을 어떤 벡터로 투영시키면 투영된 데이터 포인트들의 분산이 비교적 클 것이고, 또다른 어떤 벡터로 투영시키면 분산이 비교적 작을 것이다. 분산이 가장 큰 방향(또는 벡터)이 데이터에서 가장 많은 정도를 담고 있는 방향이다[2]. 즉, 어떤 벡터로 투영된 데이터의 분산이 클수록 데이터를 의미있게 분석할 수 있다. 그러므로 PCA는 투영했을 때 데이터 포인트들의 분산이 큰 벡터들을 찾는다. 


그림1. 투영했을 때 분산이 큰 벡터를 찾는다.



그 벡터들은 곧 데이터의 상관계수행렬의 고유벡터들 중 큰 고유값과 매칭되는 고유벡터들과 같다. 무슨 말인지는 찬찬히 아래를 보면서 이해해가보도록 하자. 이제 PCA가 어떻게 작동하는지 설명하겠다. 


우리에게는 총 N개의 데이터 포인트가 주어졌다. 



각각의 데이터 포인트는 d차원이다. 즉 각각의 데이터 포인트는 d x 1 벡터이다. 


우선 데이터의 평균이 0이 되도록 표준화(normalization) 작업을 해준다. 이 표준화 작업은 머신러닝 또는 딥러닝 알고리즘들을 훈련하기 전에 필수적으로 해준다. 각 특성마다 특성값의 범위가 꽤 다르다. 그러다보니 범위가 큰 어떤 한 두개의 특성에 결과가 좌지우지되곤 한다. 따라서 모든 특성값을 0에서 1사이의 값 또는 -1에서 1사이의 값이 되도록 조정해서 어떤 한 두개의 특성에 좌지우지되지 않게 한다. 여기서는 -1에서 1로 표준화한다.  


편의상 표준화된 데이터 포인트들도 아래와 같이 표현하겠다. 



표준화된 모든 데이터들을 크기가 1인 어떤 단위 벡터(unit vector)로 투영시키면 아래와 같이 쓸 수 있다. 

  


이 투영들의 분산을 구한다. 투영들의 분산이 크게 되는 단위 벡터들을 찾을 것이기 때문이다. 


...(공식1: 투영들의 분산)


여기서 


...(공식2: 상관계수행렬(correlation coefficient matrix))


상관계수행렬이라고 부른다. C를 다시 정리하면,


...(공식2-1: 상관계수행렬)


이제 첫번째 주성분 벡터는 아래의 최적화 문제를 푸는 것에 의해 구해진다. 


...(공식3: 첫번째 주성분 벡터를 구하는 최적화 문제)


즉, 투영했을 때 투영들의 분산이 가장 큰 단위벡터를 구하자는 말이다. 이 문제는 라그랑주 승수법에 의해 풀 수 있다. 라그랑주 승수법은 최적화 문제에 사용되는 수학적 기법으로 최대 또는 최소값을 찾으려는 문제에서 해결방법으로 사용된다[1]. 라그랑주 승수법은 목적함수와 제약 조건을 새로운 변수 를 이용해 보조 방정식을 만든 다음에, 모든 변수에 대한 편미분 값이 0이 되는 변수의 해를 찾는 것이다. 우선 보조 방정식은 아래와 같다. 



이 방정식을 두 개의 변수에 대해 각각 편미분한다. 



로 편미분 한 결과에 좌편에 각각 를 곱해주면,



놀랍게도, 투영의 분산이 상관계수벡터 C의 고유값과 같다는 것이다. 따라서 공식3의 최적화 문제는 아래와 같은 고유값 문제를 푸는 것과 동일해진다. 


...(공식3의 최적화문제가 간단한 고유값 문제가 되었다)


따라서, 우리가 구하고자하는 최대 분산값을 갖게하는 단위벡터는 가장 큰 고유값과 대응되는 고유벡터가 된다. 데이터 포인트들이 큰 고유값들과 대응되는 고유벡터들에 투영되면 데이터는 비교적 크게 분산되어 투영될 것이다.


PCA는 이처럼 상관계수행렬의 큰 고유값들과 대응되는 고유벡터들을 찾아서 투영시킨다. d차원의 데이터였으므로 d보다는 작은 갯수의 고유벡터를 선택해 데이터의 차원을 축소시킨다. 즉 공헌도(contribution rate)가 작은 고유벡터는 무시하겠다는 것이다. 이 공헌도를 계산하기 위해 고유값들을 이용한다. 


k번째 고유값의 공헌도는 아래와 같이 계산한다. 지금 고유값들은 내림차순으로 정렬되어 있다는 것을 기억하자.  


...(공식4: 각 고유값의 공헌도 계산)


공식4를 보면 분모는 전체 고유값의 합이고 분자는 k번째 고유값이므로 해당 고유값이 크면 클수록 공헌도는 크다. k번째 고유값까지의 누적 공헌도(cumulative contribution rate)는 아래와 같이 계산한다.


...(공식5: 고유값의 누적 공헌도 계산)


누적 공헌도가 문턱값(이 값은 0.9가 될 수도 있고, 0.95가 될 수도 있다. 사용자 마음대로 설정 가능하다.) 이상이 되게 하는 k번째 고유값들과 매칭되는 고유벡터들이 최종적으로 투영되는 방향으로 선택된다. 누적공헌도를 이용해서 주성분을 판단하는 방법 이외에도 필요에 따라 사용자가 그냥 몇개의 차원으로 축소시킬지 정할 수도 있다.


만약 그림1의 데이터 포인트들이 3차원이라고 가정하면, 우리는 3개의 주성분을 찾을 수 있다. 즉, 투영했을 때 분산이 가장 큰 3개의 벡터 또는 방향을 찾은 것이다(그림 2 참고). 


그림2. 3차원의 데이터 포인트들이므로 3개의 주성분을 찾았다.

 


여기서 주목할 것은 주성분 벡터끼리는 서로 직각(orthogonal)이라는 사실이다. 3개의 주성분을 찾은 후에 그중 공헌도가 가장 적은 주성분 벡터를 제외한다. 누적 공헌도로 판단했더니 세번째 주성분 벡터는 제외되었다고 가정하자(그림 3 참고).


그림3. 세번째 고유벡터는 공헌도가 작다고 판단되어 제거되었다.

 


그렇다면 이제 데이터 포인트들을 살아남은 2개의 주성분 벡터로 각각 투영시킨다. 그러면 우리는 축에 대한 좌표값과 축에 대한 좌표값을 얻게 될 것이다. 이런 방식으로 PCA는 3차원의 데이터를 2차원으로 축소시킬 수 있다. 



 커널 기반 PCA (KPCA)


우선 커널 기법은 주어진 데이터를 고차원의 특성 공간으로 사상해주는 것이다. 원래 공간에서는 분석하기 어려운 데이터들은 커널 기법을 통해 분석하기 쉬운 분포를 보이곤 한다. http://bskyvision.com/163를 참고하자. 커널 기반 PCA는 데이터 포인트들을 우선 커널 함수를 이용해 고차원 공간으로 사상(mapping)시킨 후에 PCA를 적용하는 것이다. PCA와 커널 기법을 이해했다면 그다지 어렵지 않다. 자주 사용되는 커널에는 크게 3종류가 있다. 


1) 선형 커널

2) 다항식 커널

3) 가우시안 커널


많은 경우에 가우시안 커널이 가장 좋은 성능을 보인다. 모든 경우에 그렇다는 건 아니다. 



 PCA 활용해서 데이터 분석 예제


이제 PCA를 활용해서 어떻게 데이터의 차원을 축소시키고, 그로 인해 어떠한 효과를 볼 수 있는지를 실례를 들어 살펴보겠다. 이를 위해 우리는 윈스콘신 유방암 데이터셋을 활용했다. 이 데이터셋에 대한 상세한 내용은 여기를 참고하자. 

=>http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.names


데이터셋의 샘플들은 여기서 얻었다. 

=> http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/


링크에 들어가서 breast-cancer-wisconsin.data를 클릭하면 숫자들이 나열되어 있는 것을 확인할 수 있다. 이 숫자들은 699개의 샘플에 대한 정보다. 각 샘플당 첫번째 값은 샘플 아이디를 의미(아마도 어떤 사람을 지칭)하고, 2번째 값부터 10번째 값까지는 특성 값들이다(9개의 특성). 그리고 마지막 11번째 값은 라벨값으로 2는 양성(benign), 4는 악성(malignant)을 뜻한다. 그니까 유방암 환자들과 일반인들의 세포핵에서 측정한 결과들을 특성화한 것이다. 


9개의 특성은 아래와 같이 구성되어 있다. 


1) clump thickness 세균 덩어리의 두께

2) uniformity of cell size 세포 크기의 균일성

3) uniformity of cell shape 세포 모양의 균일성

4) marginal adhesion 

5) single epithelial cell size 단일 상피 세포 크기

6) bare nuclei

7) bland chromatin

8) normal nucleoli

9) mitoses


의학적 용어라 정확한 의미는 잘 모르겠다. 하지만, 유방암의 유무를 판단하는데 도움이 될만한 특성들인 것은 분명한 듯하다. 암튼 몰라도 되니 넘어가자. 


699개의 샘플 중에 16개는 특성값 중에 누락된 정보가 있어서 그 샘플들은 제거했다. 그래서 나는 총 683개의 샘플을 가지고 분석을 실시했다. 정리된 자료가 필요하시다면 이것을 사용하셔도 좋습니다.  breast_cancer1.txt


이 샘플들은 9개의 특성을 갖고 있기 때문에, 9차원이다. 9차원의 정보를 시각화한다는 것은 불가능하다. 그래서 PCA를 활용해서 2차원으로 차원 축소한 다음에 데이터를 분석해보려고 한다. 이 9개의 특성들이 유방암을 판단하기에 유용한 특성들인지를 살펴볼 것이다.


매트랩으로 코드를 구현해보았다. 매트랩 내의 pca 함수를 사용하지 않고 직접 코딩해보았다. 공헌도로 몇 개의 주성분을 남길지 결정하지 않고, 2개의 주성분만을 남기도록 자의적으로 설정했다. 9차원의 정보를 2차원으로 시각화할 것이기 때문이다.   


clc, clear, close all


data = load('breast_cancer1.txt');

feature = data(:, 2:10); % 특성값

label = data(:, 11);  % 라벨값


[nfeature, mu, sigma] = zscore(feature); % 특성값이 -1에서 1사이, 평균 0이 되도록 표준화.  


cov_mat = cov(nfeature);

[eigvec, eigval] = eig(cov_mat);

eigval1 = diag(eigval);

[sorted_eigval, ind] = sort(eigval1, 'descend');

sorted_eigvec = eigvec(:, ind);


Y = nfeature*sorted_eigvec(:, 1:2); % dimension reduction


figure(1),

hold on

plot(Y(label==2, 1), Y(label==2, 2), 'b*'); % 라벨값 2는 양성

plot(Y(label==4, 1), Y(label==4, 2), 'ro'); % 라벨값 4는 음성


xlabel('first primary component')

ylabel('second primary component')

legend('양성', '악성')


PCA를 적용한 결과 만들어진 그래프를 확인하자. 


그림 4. 유방암 데이터에 PCA를 적용한 결과.


그림4에서 볼 수 있듯이, 양성과 악성인지 이 특성들을 이용해 어느 정도 판단할 수 있음을 알 수 있다. 양성인 경우 2개의 주성분으로 투영된 샘플들의 값이 거의 모여있고 비교적 작은 값들을 갖는다. 반면, 음성인 경우 투영된 샘플들의 값이 비교적 클 뿐더러 값들의 분산도 꽤 크다. 


유방암 환자인지 아닌지 모르는 사람에 대한 샘플이 있다면, 이 두 개의 주성분으로 투영시킴으로 대강 판단할 수 있을 것이다. 투영된 결과 악성 샘플들과 결과가 비슷한 것 같다면, 의사는 이 결과를 가지고 진단 받은 사람에게 유방암일 가능성이 크니 큰 병원에 가시거나 정밀검사를 받을 것을 권유할 것이다. 


물론 더 정확하게 판단하려면 더 좋은 특성들을 도출하거나, 이 중 어떤 특성들을 제거하거나, SVM, CNN 등으로 분류기를 정확하게 훈련시켜야 할 것이다. 


이렇게 9차원의 특성값들과 라벨값들의 관계를 2차원으로 축소시켜서 눈으로 볼 수 있게 되니 데이터를 더 잘 이해할 수 있게 되었다. 



 정리


PCA는 데이터의 차원 축소를 위한 툴이다. 이를 위해 데이터 내에 있는 주성분들을 찾아낸다. 주성분 중에서 비교적 중요한 방향으로 원래 데이터 포인트들을 투영시킨다. 그 과정 중에 차원이 축소된다. 차원을 축소함으로 고차원의 데이터를 시각화해서 데이터를 더 잘 이해할 수 있다. 차원을 축소하는 가운데 데이터 내의 일종의 노이즈들이 제거될 수도 있다. 또한 차원을 축소하므로 데이터 내에 있는 중요한 정보만을 남길 수도 있다. 


정성들여 글을 작성했습니다. 도움이 되셨다면 공감 눌러주시고, 댓글 남겨주시면 감사하겠습니다. 질문은 언제든 환영입니다. 여기까지 끝까지 성실하게 읽으신 분께는 분명 어떠한 소득이 있었을 것이라 믿고 가벼운 마음으로 글을 마칩니다.^^  




<참고자료>

[1] https://wikidocs.net/5719, 라그랑주 승수법에 대한 설명

[2] 안드레아스 뮐러, 세라 가이도 지음, 박해선 옮김, "파이썬 라이브러리를 활용한 머신러닝", 한빛미디어

+ Recent posts

티스토리 툴바