SOGM'S Data

PCA를 직관적으로 이해해보자 본문

About Data/Linear Algebra

PCA를 직관적으로 이해해보자

왈왈가부 2020. 10. 28. 16:42

이해하면 까먹고 , 손에 잡힐 것 같으면서 안잡히는 PCA를 이해해봅시다.

직관적인 이해를 위해 수학적인 요소는 빼보았습니다!

일단 거두절미하고 PCA의 가장 큰 목적은 차원을 축소하고 차원을 추출하는데 필요합니다. 

 

우선 PCA(Principal component analysis)는 주성분 분석을 뜻하는데, 

 

PCA, 출처:https://blog.bioturing.com/2018/06/14/principal-component-analysis-explained-simply/

 

위와 같은 그림은 우리가 흔히 PCA를 볼때 가장 잘 아는 그림입니다. 

PCA는 어떠한 데이터 분포를 분산이 가장 큰 방향으로 정사영하며 이뤄진다.

즉, 어떠한 데이터의 분포를 설명할 때 2가지 벡터로만 간단하게 설명하고 싶다면? 

위에 있는 두 화살표들(벡터들) 이 데이터의 분포를 가장 잘 설명할 수 있는데 해당 벡터들은 

분산이 가장 큰 방향으로 생성된다는 뜻입니다. 아래 쉬운단어로 표현했습니다. 

 

예를 들어 위 그래프는 50명의 학생들의 키와 몸무게가 분포라고 가정합시다.

이때 변수(Feature)는 키와 몸무게 2개이며, 위 의 그래프의 x축이 키 , y축이 몸무게입니다. 

자 이제, 저 데이터 분포의 특징들을 고스란히 담아놓기 위해서는 

 

1. 우선, PCA1 벡터에 고스란히 정사영 시킨다.

하지만 2차원을 1차원 선으로 사영시키다 보니 당연히 겹치는 데이터들이 생깁니다. 

      (1-1. 안겹치는 데이터가 40개 ,겹치는 데이터가 10개라 가정)

      (1-2. 다시 풀어 쓰자면 각 데이터 포인트에서 PCA1에서 수직으로 내려오면 10개의 겹치는 점들이 있다는 뜻)

 

2. 위에서 PCA1 위의 겹치는 10개의 데이터 포인트를 가장 잘 표현 해주기 위에서 해야할일은?

-> 이번에는 점들을  PCA2 벡터에 사영한다. 왜? 

->PCA1 벡터에 사영된 점들중에 겹쳤던 10개의 데이터들을 안겹치게하려면 PCA1벡터와 수직이 되는 벡터에 정사영하면 겹치는 데이터들이 없어지기 때문에 

더 이상 겹치는 데이터가 없으면 당연히 PCA3 벡터도 필요없다는 것을 직관적으로 알게됩니다.

(필요없는게 아니라 당연히 없는것이지만) 

 

여기서 알 수 있는 점은 나머지 10개의 점을 잘 표현하는 최적의 PCA2를 그려보면 PCA1과 직교한다는 점입니다.

PCA 한 번의 턴에 최대한 많이 설명하려고 한다고 이해하면 그 다음 선은 당연히 아예 수직인 직선이 나와야겠죠? 

(자세한 이유는 분산이 최대화 되는 방향으로 분해가 이루어져야 때문입니다.)

참조 블로그: ratsgo.github.io/machine%20learning/2017/04/24/PCA/

 

주성분분석(Principal Component Analysis) · ratsgo's blog

이번 글에서는 차원축소(dimensionality reduction)와 변수추출(feature extraction) 기법으로 널리 쓰이고 있는 주성분분석(Principal Component Analysis)에 대해 살펴보도록 하겠습니다. 이번 글은 고려대 강필성

ratsgo.github.io

 

자 이제 키와 몸무게를 가진 50명의 데이터를 PCA1 ,PCA2의 벡터로 모두 설명할 수 있게 되었습니다.

우리는 이 PCA1과 PCA2를 주성분이라 부르며, 2개가 존재함을 확인했습니다.

위의 예시를 통해 PCA N에서, N은 데이터의 Feature의 수와 같으며 각각 직교하는 벡터라고 할 수 있습니다. 

 

그렇다면 실제로는 어떻게 쓰일까?

 

 PCA는 실제로 이미지 데이터에 많이 쓰인다.  

자 이제 위의 사례에서  50명의 학생의 키와 몸무게가 아닌 얼굴 사진(256*256)의 데이터가 있다고 가정합시다.

아까는 키와 몸무게 2가지 변수인 50*2 데이터셋으로  PCA벡터(주성분)은 2개가 존재했습니다.

그렇다면 이번에는 PCA 벡터(주성분)은 몇 개일까요? 

-> 이미지의 데이터 256*256  = 65536로 Flatten (1차원 벡터화) 시킬 수 있습니다.

그러므로 주성분 역시 역시 65536개!

(키와 몸무게처럼 와닿지 않으실 수 있지만 이 65535도 역시 같은 Feature라고 생각해주세요)

자 이제 데이터 셋은 50 * 65536이 됩니다. ( =50명의 학생들의 얼굴 사진이 65536차원의 50개의 점입니다.)

그렇다면 주성분 벡터 PCA1~ PCA65536가  존재합니다. 

 

 

여기서 PCA의 활용은? 

 

아까 키와 몸무게의 사례에선 50명의 학생의 데이터를 표현하기 위해

PCA1으로 40명, PCA2로 나머지 10명의 데이터를 설명할 수 있었습니다.

즉 PCA1이 80% , PCA2가 20%의 분포를 설명하죠.

하지만 아래 사례에서는 50명의 학생의 얼굴을 65535개의 PCA로 설명할 필요가 있을까요? 

대략적으로 누군가의 얼굴을 구분할 때  떠올리는 특징을 떠올려봅시다. ( 눈, 코, 입, 귀, 쌍커풀 유무, 안경, ...)

한참 생각해도 65535개의 특징을 말할 수가 없습니다.

바꿔 말하자면 어떤 학생의 얼굴을 표현하는데 65535개의 특징을 전부 말할 필요가 없다는 뜻입니다.

즉, 최소 특징 K개만 있어도 얼굴을 설명할 수 있다는 뜻이죠.

* 여기서 중요한점은, PCA는 SVD와 달리 데이터 행렬 자체를 분해하는 것이 아닌 공분산 행렬을 분해하여 공분산 행렬의 고유벡터들을 구합니다.( 이유는 맨 아래 블로그 링크 참조 )  

 

즉, 주성분 벡터가 모여있는 주성분 행렬은 다음과 같이 구할 수 있습니다. 

주성분행렬 = 고유벡터행렬 · 데이터행렬.T 

공분산행렬(65535 * 65535)의 고유벡터행렬 (65535 * 65535)와 본래 데이터 X(50*65535)의 전치행렬 X.T를 내적하면 얻을 수 있습니다.

최종 주성분 행렬은  50*1의 형태를 띈 주성분 벡터 65535개로 이루어져있습니다.(즉, 50 *65535 )

그중 K=5개의 주성분은 당연히 그 중 가장 먼저인 고유벡터  상위 5개만을 쓴다는 거겠죠?

그렇다면 주성분 5개를 쓰면 (50*5)의 성분으로  본 데이터행렬(50*65535)를 설명가능한 것입니다! 

(물론 극단적 비교를 위해 5개라 했지만 데이터를 좀 더 표현해야한다면 주성분을 더 많이 채택해야겠습니다)  

 

그렇다면 공분산행렬의 고유값은 어디에 쓰일까요?

이때 65535개의 고유벡터는 각각 고유값을 가지는데 이 고유값의 값을 다 더한 값에서 첫 번째 고유값을 나누면 

그 값이 바로 PCA 첫 번째 주성분의 설명력이 됩니다. 

예를들어 주성분 2개가 설명하는 설명력을 보기위해선 (첫 번째 고유값 + 두 번째 고유값) / 전체 고유값의 합

이 되겠습니다. 

 

예시

예를 들기 위해  K=5 를 선택하고 K는 각각 얼굴형태 , 눈,  코, 쌍커풀, 안경이라고 가정하겠습니다. 

+ 참고로 얼굴의 특징은 잠재요인입니다. 제가 가정한 것이지 각 주성분이 눈인지 코인지 정의할 수는 없습니다.

 + 시각화로서 표현하여 대략적인 특징은 알 수 있겠지만, 딱 부위를 정의할 수는 없다는 뜻이죠.

50명의 얼굴을 가장 잘 구분할 수 있는

상위 5개의 주성분 얼굴형태(PCA1), 눈(PCA2), 코(PCA3), 쌍커풀(PCA4), 안경(PCA5)을 설정했습니다.

그렇다면 50명중 한명인 철수의 얼굴은 위 5가지 주성분으로 어떻게 표현될까요? 

 

철수의 얼굴  = C1 * PCA1 + C2 * PCA2 ········· C5 * PCA5  

                 = C1 * 얼굴형태 + C2 * 눈 ········· C5 *안경

으로 철수의 얼굴을 표현할 수 있다. ( = 각 주성분의 선형결합이다 )  

 

PCA1 ~ PCA K까지의 K개의 성분만 쓰더라도 데이터를 설명할 수 있음과 동시에 데이터의 용량을 줄일 수 있죠.

 

 

 

즉 정리하자면 ,

PCA에서는 PCA벡터는 데이터의 분포를 설명하는 어떠한 성분들이고, K개를 선택하여 데이터를 축소할 수 있습니다.

이 K개를 정하여 적절하게 데이터를 축소 시키는 것이 중요합니다.

주성분 개수에 비해 너무 적은 K를 선택한다면? 데이터를 잘 설명할 수 없을 것이고 

반대로 너무 큰 K를 선택한다면? 데이터 용량이 커지고 Overfitting될 확률이 높습니다.    

 

 PCA는 공분산 행렬을 고유값 분해함으로서 구할 수 있는데 해당 정보는 아래 블로그를 참조해주세요!

 

해당 포스트는 공돌이의 수학정리 (출처: angeloyeo.github.io/2019/07/27/PCA.html#fnref:3) 참고하였습니다.

 

주성분 분석(PCA) - 공돌이의 수학정리노트

 

angeloyeo.github.io

해당 포스트는 다크프로그래머님의 블로그 (출처: arkpgmr.tistory.com/110) 를 참고하였습니다.

 

[선형대수학 #6] 주성분분석(PCA)의 이해와 활용

주성분 분석, 영어로는 PCA(Principal Component Analysis). 주성분 분석(PCA)은 사람들에게 비교적 널리 알려져 있는 방법으로서, 다른 블로그, 카페 등에 이와 관련된 소개글 또한 굉장히 많다. 그래도 기

darkpgmr.tistory.com

 

Comments