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

수학 이야기 2013.11.08 21:01

주성분 분석, 영어로는 PCA(Principal Component Analysis).


주성분 분석(PCA)은 사람들에게 비교적 널리 알려져 있는 방법으로서, 다른 블로그, 카페 등에 이와 관련된 소개글 또한 굉장히 많다. 그래도 기존에 이미 있는 내용들과 차별성이 있다면 이 글은 주성분 분석(PCA)을 자신의 공부, 연구 또는 개발에 보다 잘 활용할 수 있도록 주성분분석(PCA)의 다양한 활용예를 중심으로 기본 원리 등을 가급적 폭넓게 다뤄보고자 한다.


주성분 분석(PCA)은 사실 선형대수학이라기 보다는 선형대수학의 활용적인 측면이 강하며 영상인식, 통계 데이터 분석(주성분 찾기), 데이터 압축(차원감소), 노이즈 제거 등 다양한 활용을 갖는다.


PCA(Principal Component Analysis)에 대한 계산 방법이나 이론적인 부분은 뒤에 가서 다루고 일단은 PCA에 대한 개념 및 활용적인 측면을 먼저 살펴보도록 하자.



1. PCA(Principal Component Analysis)란?


PCA는 분포된 데이터들의 주성분(Principal Component)를 찾아주는 방법이다. 좀더 구체적으로 보면 아래 그림과 같이 2차원 좌표평면에 n개의 점 데이터 (x1,y1), (x2,y2), ..., (xn,yn)들이 타원형으로 분포되어 있을 때


<그림 1> 2D에서의 PCA 예


이 데이터들의 분포 특성을 2개의 벡터로 가장 잘 설명할 수 있는 방법은 무엇일까? 그건 바로, 그림에서와 같이 e1, e2 두 개의 벡터로 데이터 분포를 설명하는 것이다. e1의 방향과 크기, 그리고 e2의 방향과 크기를 알면 이 데이터 분포가 어떤 형태인지를 가장 단순하면서도 효과적으로 파악할 수 있다.


PCA는 데이터 하나 하나에 대한 성분을 분석하는 것이 아니라, 여러 데이터들이 모여 하나의 분포를 이룰 때 이 분포의 주 성분을 분석해 주는 방법이다.


여기서 주성분이라 함은 그 방향으로 데이터들의 분산이 가장 큰 방향벡터를 의미한다. <그림 1>에서 e1 방향을 따라 데이터들의 분산(흩어진 정도)이 가장 크다. 그리고 e1에 수직이면서 그 다음으로 데이터들의 분산이 가장 큰 방향은 e2이다.


PCA는 2차원 데이터 집합에 대해 PCA를 수행하면 2개의 서로 수직인 주성분 벡터를 반환하고, 3차원 점들에 대해 PCA를 수행하면 3개의 서로 수직인 주성분 벡터들을 반환한다. 예를 들어 3차원 데이터의 경우는 아래 그림과 같이 3개의 서로 수직인 주성분 벡터를 찾아준다.


<그림 2> 3D에서의 PCA



2. PCA(Principal Component Analysis) 활용


A. 2D 점들의 직선 근사


이전 글 [선형대수학 #5] 선형연립방정식 풀이에서 예로 들었던 네 점 (1, 3.5), (2, 4.3), (3, 7.2), (4, 8)을 가장 잘 근사하는 직선의 방정식을 PCA로 구해보자.


<그림 3> PCA 라인 근사


PCA로 직선을 근사하는 방법은 데이터들의 평균 위치를 지나면서 PCA로 나온 제 1 주성분 벡터와 평행인 직선을 구하면 된다.


실제로 위 네 점을 지나는 직선을 PCA로 구해보면 y = 1.7194x + 1.4515가 나오며 그 그래프는 <그림 3>과 같다. 그림에서 보듯이 PCA로 구한 직선과 최소자승법(LS 방법)으로 구한 직선이 모두 다름을 볼 수 있다. 그 이유는 최소자승법은 직선과 데이터와의 거리를 최소화하는 반면 PCA는 데이터의 분산이 가장 큰 방향을 구하기 때문이다.


계산적인 측면에서 보면 PCA는 최소자승법(LS)에 비해 훨씬 효율적이다. 왜냐하면 데이터의 차원이 n, 데이터의 개수가 m개일 때 LS는 n×m 행렬의 의사역행렬(pseudo inverse)를 계산해야하지만 PCA는 n×n 행렬의 고유값 분해만 계산하면 되기 때문이다 (2차원 평면에서 1,000개의 점을 근사하는 경우를 생각해 보면 LS는 2 x 1,000의 역행렬을 계산해야 하고 PCA는 2 x 2 행렬의 고유값 분해만 하면 된다). => 잘못된 설명으로 삭제함 (2015.12.29 댓글 참조)


☞ 그림 3에서 LS근사(y=ax+b)는 직선과의 y축 거리를 최소화시키고, LS근사(ax+by+c=0)는 평면 z = ax+by+c와의 z축 거리를 최소화시킨다 (평면 z = ax+by+c과 xy평면과의 교선이 ax+by+c=0). PCA는 데이터들의 평균점을 지나는 직선들 중에서 데이터들을 직선에 투영(projection)시켰을 때 해당 직선을 따라서 데이터의 분산이 최대가 되는 방향의 직선을 구한다.



B. 3D 점들의 직선 또는 평면 근사


3차원 공간에서 점들의 집합을 직선으로 근사하는 문제는 최소자승법(LS, Least Square Method)으로는 쉽지가 않다. 하지만 주성분분석(PCA)을 이용하면 이를 손쉽고 효율적으로 구할 수 있다. 만일 주어진 데이터 점 (x1,y1,z1), (x2,y2,z2), ... (xn,yn,zn)들의 평균이 (mx,my,mz)이고 PCA로 구한 제 1 주성분 벡터가 e1 = (a,b,c)라면 이들 데이터 점들을 근사하는 직선식은 다음과 같다.


 --- (1)


이들 점들을 평면 방정식으로 근사하는 경우에도 PCA를 적용할 수 있다. 만일 PCA로 나온 제 1 주성분 벡터가 e1, 제 2 주성분 벡터가 e2라면 근사 평면 방정식은 다음과 같다.


 --- (2)


단, ×는 벡터의 외적, x = (x,y,z), m = (mx,my,mz).



C. eigenface와 영상인식 응용


PCA가 영상인식에 활용되는 대표적인 예는 얼굴인식(face recognition)이다. 그리고 이와 관련된 개념 혹은 용어로서 eigenface(아이겐페이스)라는게 있다.


다음과 같은 20개의 45x40 얼굴 이미지들이 있다고 하자.


<그림 4> 45x40 얼굴 이미지 20장


이미지에서 픽셀 밝기값을 일렬로 연결하여 벡터로 만들면 이들 각각의 얼굴 이미지는 45x40 = 1,800 차원의 벡터로 생각할 수 있다 (즉, 각각의 이미지는 1,800 차원 공간에서 한 점(좌표)에 대응).


이제 이 20개의 1,800차원 점 데이터들을 가지고 PCA를 수행하면 데이터의 차원 수와 동일한 개수의 주성분 벡터들을 얻을 수 있다. 이렇게 얻어진 주성분 벡터들을 다시 이미지로 해석한 것이 eigenface이다 (얼굴 이미지를 가지고 얻은 벡터이기에 eigenface라 부른다). 실제 위 이미지에 대해 얻어진 1,800개의 eigenface들 중 분산이 큰 순서대로 처음 20개를 나열하면 아래 그림과 같다.


<그림 5> 처음 20개의 eigenface들


위 그림에서 볼 수 있듯이 앞부분 eigenface들은 데이터들에 공통된 요소(얼굴의 전반적인 형태)를 나타내고 뒤로 갈수록 세부적인 차이 정보를 나타낸다. 그리고 더 뒤로 가면 거의 노이즈(noise)성 정보를 나타낸다.


앞서 PCA를 통해 얻어진 주성분 벡터들은 서로 수직인 관계에 있다고 말한 바 있다. 이 말은 주성분 벡터들이 n차원 공간을 생성하는 기저(basis) 역할을 할 수 있음을 의미한다. 즉, PCA로 얻은 주성분 벡터들을 e1, e2, ..., en라면 임의의 n차원 데이터 x는 x = c1e1 + c2e2 + ... + cnen과 같이 ei들의 일차결합으로 표현될 수 있다 (이 때, 상수계수 ci들은 x와 ei의 내적 즉, ci = x·ei로 계산할 수 있으며 이와 같이 어떤 데이터 집합의 데이터들을 그들의 주성분 벡터들의 일차결합으로 표현하는 것을 Karhunen–Loève transform (KLT) 또는 Hotelling transform이라 부른다).


그런데, 뒷부분의 주성분 벡터들은 데이터 분포에 포함된 노이즈(noise)성 정보를 나타내기 때문에 뒷부분은 버리고 전반부 k개의 주성분 벡터들만을 가지고 원래 데이터를 표현하면 노이즈가 제거된 데이터를 얻을 수 있다. 즉, 원래의 x가 x = c1e1 + c2e2 + ... + cnen일 때 xk = c1e1 + ... +ckek로 x를 근사하는 것이다. 위 얼굴 이미지들에 대해 전반부의 일부(k = 20, 10, 5, 2) eigenface들만을 이용한 근사 이미지들은 아래 그림과 같다 (클릭시 확대 이미지).


<그림 6> k개의 eigenface만을 이용한 데이터 복원(reconstruction)


그림에서 볼 수 있듯이 많은 수의 eigenface를 이용하면 원본 얼굴과 거의 유사한 근사(복원) 결과를 볼 수 있지만 k가 작아질수록 개인 고유의 얼굴 특성은 사라지고 공통의 얼굴 특성이 남게 된다 (k=20인 경우 원래 얼굴이 그대로 살아나지만 k=2인 경우 개인간의 구분이 거의 사라짐을 볼 수 있다).


☞ k개의 주성분 벡터만을 이용하여 원래 데이터를 표현하는 것은 통상적으로 근사라는 용어보다는 복원(reconstruction)이라는 용어가 주로 사용된다.


☞ 노이즈(noise)에 대해 좀더 생각해 보면, 앞서 말했듯이 PCA는 개별 데이터에 대한 분석이 아니라 전체 데이터에 대한 집합적 분석 도구이다. 만일 강아지 100마리에 대한 PCA 분석 결과와 고양이 100마리에 대한 PCA 분석 결과가 있다고 하자. 이 때, 강아지 데이터에서 얻어진 eigenface들 중 앞의 것들은 (고양이와 구분되는) 강아지 고유의 형태 정보를 나타내고 뒤로 갈수록 강아지들 내부에서 강아지들 사이의 차이점을 표현할 수 있는 정보를 나타낸다. 그리고 더 뒤로 나아가면 노이즈성 정보를 표현한다. 마찬가지로 고양이 데이터에 대한 eigenface들은 주요한 성분일수록 고양이 공통의 성분, 뒤로 갈수록 고양이 개체 사이의 차이를 가르는 요소를 나타낸다. 그런데, 어디서 어디까지가 데이터 공통 성분이고 어디까지가 데이터의 차이인지, 그리고 어디부터 노이즈 성분인지 그 구분은 명확하지 않다. 그 경계를 이론적으로 계산하는 방법론 등도 있긴 하지만 대부분은 응용에 따라서, 그리고 데이터에 따라서 주관적으로 또는 실험적으로 결정하는 것이 통상적이다.


☞ 위에서 설명한 k개의 주성분 벡터만을 이용하여 원래 데이터를 표현하는 것은 관점에 따라서 차원 감소(dimension reduction), 데이터 압축(compression), 노이즈 제거 등으로 다양하게 해석될 수 있다. 먼저, 차원감소라 함은 n차원의 데이터를 xk = c1e1 + ... + ckek로 표현했을 때 e1, ..., ek를 새로운 좌표축으로 하는 공간에서 x를 (c1, c2, ..., ck)와 같이 k차원의 점으로 표현한다는 의미이다. 둘째, 데이터 압축의 의미는 {x}들을 그대로 저장하지 않고 k개의 주성분 벡터들과 계수 (c1, .., ck)들만을 저장하면 저장용량을 크게 줄일 수 있다는 의미이다. 참고로 SVD(특이값분해)를 이용한 데이터 압축은 데이터를 개별적으로 압축하지만 PCA는 데이터를 집합적으로 압축한다는 점이 다르다. 마지막으로 노이즈 제거란 의미는 k개의 주성분만을 이용해서 데이터를 복원함으로써 의미없는 노이즈 부분을 날린다는 의미이다.


☞ 참고용으로 위에서 사용한 20개의 샘플 얼굴 이미지들과 PCA, eigenface 및 k reconstruction 과정에 대한 matlab 코드를 첨부로 올립니다:


eigenface_test.zip



D. PCA를 이용한 얼굴검출과 얼굴인식


먼저, 컴퓨터 비전에서 사용하는 detection과 recognition의 차이를 살펴보면 face detection은 사람 구분없이 그냥 얼굴을 찾는 것이고, face recognition은 이 얼굴이 누구 얼굴인지를 알아내는 것을 말한다.


i) face detection 응용


PCA를 얼굴검출에 응용하기 위해서는 먼저 수많은(최소 1,000개 이상) 얼굴 샘플들을 모아서 eigenface들을 구한 후 얼굴로서 의미가 있다고 생각되는 전반부 k개의 eigenface들만을 선택한다. 이후 테스트할 입력 영상(윈도우 영역) x가 들어오면 x를 k개의 eigenface들만을 이용하여 복원(reconstruction) 했을 때 원래 영상 x와 얼마나 가까운지를 살펴본다. 만일 x가 k개의 eigenface를 조합해서 완벽히 근사된다면 x는 얼굴일 확률이 매우 높다. 또 하나의 판단 기준은 이렇게 근사된 xk가 평균적인 얼굴(average face)과 얼마나 가까운가이다. x가 아무리 eigenface들로 근사가 잘 되어도 실제 평균 face와 동떨어져 있다면 face로 보기 힘들다. 따라서, x에 대한 최종 판단은 얼마나 근사가 잘 되는지와 근사된 얼굴이 실제 얼굴 이미지 평균과 얼마나 차이가 있는지를 종합적으로 고려하여 판단한다.


이러한 두 평가기준의 차이를 그림으로 나타내면 아래 그림과 같다. 그림에서 DFFS는 얼마나 근사가 잘 되는지를 나타내고 DIFS는 근사된 얼굴이 얼굴 평균과 얼마나 가까운지를 나타낸다.


<그림 7> PCA의 detection 응용


☞ 위 방법은 PCA가 어떻게 활용될 수 있는지를 설명하기 위한 예일 뿐이며 실제로 위 방법이 face detection에 있어서 매우 효과적인 방법이라는 말은 아니다. 위 방법은 예전에 봤던 1998년도 논문 방법인데, 당시로서는 대표적인 face detection 논문 중 하나였다 (논문 제목은 기억이 잘 안남). 예전에 위 방법을 실제로 구현해 본 적이 있었는데 그다지 결과가 좋지는 않았다.


ii) face recognition 응용


PCA를 recognition에 응용할 때에는 조금 방법이 다르다. 먼저, 모든 사람의 얼굴 샘플을 모을 필요가 없으며 인식 대상이 되는 사람들의 얼굴 샘플들만을 모은다 (예를 들어 보안시스템의 경우 출입이 허가된 사람들의 얼굴 샘플). 이들 샘플들에 대해 PCA를 통해 k개의 주요 eigenface들을 구한 후 각 개인들을 eigenface로 근사했을 때의 근사계수를 저장한다. 즉, xk = c1e1 + ... + ckek일 때 (c1, ..., ck)를 개인의 고유 feature로 저장한다. 이후 입력 데이터 x가 들어왔을 때 이를 k개의 eigenface로 근사한 근사계수가 미리 저장된 개인별 근사계수들 중 누구와 가장 가까운지를 조사하여 x를 식별한다.


☞ 만일 인식할 대상이 DB에 저장된 사람들 중 한명이라면 이 방법으로 등록된 사람들 중 누구인지 쉽게 식별할 수 있다. 그러나 DB에 등록되지 않은 사람이라면 이를 식별하는 것은 별도의 문제이다. 실제로 이 방법이 얼마나 효과적인지는 잘 알지 못하며 그냥 PCA 특성을 이런 식으로도 활용 가능하다는 정도로 참고하기 바랍니다.



E. PCA를 이용한 안경제거


이게 딱히 유용한 응용인지는 잘 모르겠지만 예전에 한 논문에서 봤던 방법으로 PCA를 이용하여 얼굴영상에서 안경쓴 사람의 안경 영역을 찾아서 안경이 제거된 얼굴 영상을 얻을 수 있는 방법이 있다 (역시 논문 제목은 잘 기억이 안남..)


그 방법을 간략히 설명하면 먼저 안경을 쓰지 않은 사람들로만 구성된 얼굴 이미지 집합을 구성한 후, PCA를 통해 eigenface들을 추출한다. 이후 테스트 영상 x에 대해 이를 k개의 eigenface들로 근사한 근사 영상 xk를 구하여 |x - xk| 의 차이가 임계치 이상인 영역(즉, 안경 영역)을 평균 얼굴 이미지로 대체한다. 이 과정을 그림으로 나타내면 아래와 같다.


<그림 8> PCA의 안경제거 응용


☞ 이상 몇몇 PCA 응용 예들을 설명했지만 PCA의 기본 원리 및 특성만 잘 이해하고 있으면 이 외에도 다양한 활용이 가능할 것입니다. 예를 들어, 영상 쪽이 아닌 음성인식, 기타 신호처리 쪽으로도 유사한 방식의 활용이 가능합니다.



3. PCA의 계산


PCA를 알기 위해서는 먼저 공분산 행렬(covariance matrix)에 대해 알아야 한다.


먼저, x와 y의 공분산(covariance)이란 아래 식과 같이 정의된다.


 --- (3)


단, mx는 x의 평균, my는 y의 평균, E[]는 기대값(평균).


x의 분산은 x들이 평균을 중심으로 얼마나 흩어져 있는지를 나타내고, x와 y의 공분산은 x, y의 흩어진 정도가 얼마나 서로 상관관계를 가지고 흩어졌는지를 나타낸다. 예를 들어, x와 y 각각의 분산은 일정한데 x가 mx보다 클때 y도 my보다 크면 공분산은 최대가 되고, x가 mx보다 커질때 y는 my보다 작아지면 공분산은 최소(음수가 됨), 서로 상관관계가 없으면 공분산은 0이 된다.


공분산 행렬(covariance matrix)이란 데이터의 좌표 성분들 사이의 공분산 값을 원소로 하는 행렬로서 데이터의 i번째 좌표 성분과 j번째 좌표 성분의 공분산 값을 행렬의 i행 j열 원소값으로 하는 행렬이다.


<그림 9> 공분산 행렬


예를 들어, 2차원 데이터 n개가 (x1, y1), (x2, y2), ..., (xn, yn)와 같이 있다면 이 데이터들의 공분산 행렬은 다음과 같이 계산된다.


 --- (4)



PCA란 한마다로 말하면 입력 데이터들의 공분산 행렬(covariance matrix)에 대한 고유값분해(eigendecomposition)로 볼 수 있다(고유값 분해에 대해서는 [선형대수학 #3] 고유값과 고유벡터 글 참조). 이 때 나오는 고유벡터가 주성분 벡터로서 데이터의 분포에서 분산이 큰 방향을 나타내고, 대응되는 고유값(eigenvalue)이 그 분산의 크기를 나타낸다.


<그림 10> PCA 계산 과정



4. 생각할 점


마지막으로 생각할 점 2가지를 남기며 글을 마무리합니다. 아직은 정리되지 않은.. 제 스스로 가지고 있는 의문이기도 합니다.


Q1. PCA에서 찾은 제 1 주성분 벡터는 데이터 분포의 분산이 가장 큰 방향을 나타낸다. 그리고 eigenface 응용에서는 첫번째 eigenface가 얼굴 공통의 형태 정보를 나타내고 뒤로 갈수록 세부적인 차이를 나타낸다. 그런데, eigenface가 바로 주성분 벡터이므로 분포의 분산방향일텐데 이게 왜 공통의 형태 정보가 되는 것일까?


=> 아래 댓글들로 좋은 의견들을 주셨고, 댓글들을 보면서 나름 정리한 설명을 적어봅니다.



A. 위 그림과 같이 PCA에서 구한 첫번째 주성분 벡터 e1은 데이터들의 분산이 가장 큰 방향을 나타낸다. 그런데, 이것을 데이터들의 좌표값 (xi, yi) 입장에서 생각해 보면 e1은 데이터들의 값을 가장 잘 대표하는 (공통의) 값이 된다. 위 그림 예에서 e1은 x=y인 단위벡터이고 데이터들도 x좌표와 y좌표가 거의 유사한 값을 갖는다. 즉, 데이터들을 (xi,yi) = kie1과 같이 e1의 상수배로 근사해 보면 e1이 데이터들의 가장 공통적인 좌표값을 나타냄을 알 수 있다. ◇



Q2. 왜 공분산행렬의 고유벡터가 데이터 분포의 분산 방향이 되고, 고유값이 그 분산의 크기가 되는 것일까?


=> 아래의 ankh님이 댓글로 알려주신 링크(http://www.stat.cmu.edu/~cshalizi/350/lectures/10/lecture-10.pdf)의 문서를 보고 어느정도 수식적으로 이해를 하게 되었습니다 (감사드립니다). 그 내용을 정리해 보면 다음과 같습니다 (수학적인 지식이 필요한 내용이긴 한데, 그냥 배경 설명없이 적도록 하겠습니다).


A. 데이터들을 zi = (x1, ..., xp), i = 1, ..., n라 하자 (데이터의 차원은 p, 개수는 n). 이 때, 크기가 1인 임의의 단위벡터 w에 대해 zi들을 w에 투영시킨(projection) 벡터 hi = (zi·w)w 들을 생각해 보면 입력 데이터 zi들의 분산을 최대화하는 방향은 결국 프로젝트된 벡터 hi의 크기인 (zi·w)의 분산을 최대화시키는 w를 찾는 문제와 동일하다.



(zi·w) 들의 분산을 σw2라 놓고, 원래의 입력 데이터들을 행벡터로 쌓아서 생성한 n x p 행렬을 Z라 하면


 --- (5)


와 같이 정리된다 (zi들의 평균이 0이 되도록 centering을 한 후라고 생각하면 (zi·w)의 평균은 0). 이 때, C = ZTZ/n 으로 잡은 C는 zi들의 공분산 행렬이 된다.


따라서 구하고자 하는 문제는 w가 단위벡터(wTw=1)라는 조건을 만족하면서 wTCw를 최대로 하는 w를 구하는 constrained optimization 문제로 볼 수 있으며 Lagrange multiplier λ를 도입하여 다음과 같이 최적화 문제로 식을 세울 수 있다.


 --- (6)


이 때, u를 최대로 하는 w는 u를 w로 편미분한 ∂u/∂w 를 0 으로 하는 값이다.


--- (7)


즉, zi에 대한 공분산 행렬 C의 eigenvector가 zi의 분산을 최대로 하는 방향벡터임을 알 수 있다. 또한 여기서 구한 w를 식 (5)에 대입하면 σw2 = wTλw = λ 가 되므로 w에 대응하는 eigenvalue λ가 w 방향으로의 분산의 크기임을 알 수 있다. ◇



[선형대수학 #1] 주요용어 및 기본공식

[선형대수학 #2] 역행렬과 행렬식(determinant)

[선형대수학 #3] 고유값과 고유벡터 (eigenvalue & eigenvector)

[선형대수학 #4] 특이값 분해(Singular Value Decomposition, SVD)의 활용

[선형대수학 #5] 선형연립방정식 풀이

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


by 다크 프로그래머


저작자 표시 비영리 변경 금지
신고
  • 이전 댓글 더보기
  • 스테판랄 2016.12.02 18:29 신고 ADDR 수정/삭제 답글

    안녕하세요 또다시 질문을 올리게 되는데요 ^^
    위 글 첫 상단에 2차 평면에 n개의 점 데이터들이 분포하고
    그들의 특성을 나타내는 고유벡터 2개를 소개해 주셨는데요.
    제가 알기론 nByn 의 행렬이면 n개의 고유벡터가 나오는 걸로 알고있는데요.
    왜 저기에선 2가지만 나오는것인지?? 2차 평면이라서 그런 것이라면
    N By N 매트릭스 에서 N개의 고유벡터가 나오는것은.... 먼가 잘 결합이 되지 않네요......
    답변 주시면 감사하겠습니다. 좋은 하루 되세요 ^^

    • BlogIcon 다크pgmr 2016.12.02 18:37 신고 수정/삭제

      n x n 행렬에 대해서는 n개의 고유벡터가 나오는게 맞습니다. 그런데, 윗글의 2D 점 데이터들의 공분산 행렬은 식 (4)와 같이 2 x 2 행렬이 됩니다. PCA는 데이터들의 공분산 행렬에 대한 고유분해입니다.

  • PCA공부 2017.03.25 17:05 신고 ADDR 수정/삭제 답글

    안녕하세요 좋은자료 올려주신덕분에 많이 도움이되었습니다.
    그런데 아직 이해가 안되는 부분이 있어서 몇가지 문의하고싶은부분이 있어서 댓글남깁니다.
    1.PCA는 여러 데이터들이 모여 하나의 분포를 이룰 때 이 분포의 주 성분을 분석해 주는 방법이라고 하셨는데 그럼 여러장의 이미지(각각의 다른사람의 얼굴)가 예를 들어 e1,e2를 설명하신 그래프하나에 모든 이미지의 데이터정보가 담겨서 그안에서 분포를 분석하는것인가요? 아니면 각각의 이미지마다 다른 그래프에 표현되나요?

    • BlogIcon 다크pgmr 2017.03.25 21:30 신고 수정/삭제

      이미지 하나 하나가 하나의 데이터이고 고차원의 공간에서의 한 점으로 표현됩니다.

  • PCA공부 2017.03.25 17:07 신고 ADDR 수정/삭제 답글

    2. 그림 5의 20개의 eigenface들의 경우
    좌측 20개중 좌측 끝의 이미지가 분산이 가장 큰 주성분인가요? 그리고 1800차원의 벡터이므로 PCA 수행시 데이터차원의 수와 같은 1800개의 주성분벡터가 나오는건가요?

    • BlogIcon 다크pgmr 2017.03.25 21:37 신고 수정/삭제

      네 그렇습니다. 그리고 pca를 수행하면 1800개의 주성분 벡터가 얻어집니다.

  • PCA공부 2017.03.25 17:08 신고 ADDR 수정/삭제 답글

    3.k가 작아질수록 개인 고유의 얼굴 특성은 사라지고 공통의 얼굴 특성이 남게 된다고 하셨는데
    그럼 k가 최대라는 것은 그림6의 경우 k=20이 최대이며 주성분만을 분석하는것이므로 노이즈 부분 제외, 즉 k가 최대일 때 (20에 가까울때의 벡터를 사용하는 것인가요?)를 분석하는건가요?
    어떤 응용프로그램을 만드느냐에 따라서 달라지겠지만 주성분분석이라하면 그림6에서라면 20을 사용하는건가요?

    • BlogIcon 다크pgmr 2017.03.25 21:44 신고 수정/삭제

      k의 최대는 따로 정해져 있지 않습니다. 굳이 따지자면 1800이 최대값입니다. 어디까지가 주성분이고 어디부터 노이즈인지는 응용에 따라 자신이 정하는 것이지 미리 정해져 있는 것이 아닙니다. 자신은 첫번째 성분만 사용하겠다고 하면 (즉, k = 1로 설정) 2번째부터는 노이즈로 취급하겠다는 의미가 됩니다.

    • PCA 2017.03.27 22:11 신고 수정/삭제

      주성분이 가장큰 순서대로 행렬에 저장되는것같은데
      그럼 주성분이 1800개나왔다면
      주성분에 가까운것은 1800이며 그외 나머지부터 노이즈라고 본다고했을때
      만약 k를 1700으로 잡는다면 100개가지고 비교연산을 진행하는것인가요?

    • BlogIcon 다크pgmr 2017.03.28 09:05 신고 수정/삭제

      주성분은 데이터의 차원수(데이터의 개수가 아니라 데이터의 차원입니다)만큼 나옵니다. 즉, 1800차원의 데이터에 대해 주성분 분석을 하면 항상 1800개의 주성분 벡터가 얻이집니다. 1800개의 벡터들 중 얼마만큼을 실제 주성분으로 할지 즉, k를 얼마로 설정할지는 응용에 따라서 자신이 결정합니다. 눈으로만 보는 것과 자신이 직접 해보는 것은 많은 차이가 있습니다. 간단한 2D나 3D 샘플 데이터들에 대해 직접 주성분 분석을 해 보시면 이해에 많은 도움이 될 것입니다. Matlab 등의 툴을 이용하면 간단하게 테스트를 해 볼 수 있습니다.

  • PCA공부 2017.03.25 17:08 신고 ADDR 수정/삭제 답글

    4:k개의 주성분 벡터만을 이용하여 원래 데이터를 표현한다고하는데 k 여러개, (주성분벡터 여러개)를 사용해서 표현하는 것인가요? 그리고 k 여러개는 하나의 이미지에서나온 여러개의 주성분벡터인가요? 아니면 여러개의 이미지에서 나온 여러개의 주성분벡터인가요?

    • BlogIcon 다크pgmr 2017.03.25 21:48 신고 수정/삭제

      pca는 데이터 하나에 대해서 분석하는 것이 아니라 데이터 집합에 대해 분석하는 것입니다.

  • PCA공부 2017.03.25 17:09 신고 ADDR 수정/삭제 답글

    5. 그림4 아래에 각각의 이미지는 1800차원 공간에서 한점(좌표)에 대응 이부분은
    이미지하나가 1800차원에서 한점에 대응한다는것인가요 아니면 각 픽셀이 1800차원의 한점이 대응한다는 말인가요?

    • BlogIcon 다크pgmr 2017.03.25 21:48 신고 수정/삭제

      이미지 하나가 한 점에 대응한다는 의미입니다.

  • PCA공부 2017.03.25 17:10 신고 ADDR 수정/삭제 답글

    좋은자료 공개해주셨는데 질문을 너무 많이 달아서 죄송합니다. 계속봐도 이해가잘안되서..
    주말인데 좋은 주말 보내시기바랍니다^^

    • BlogIcon 다크pgmr 2017.03.25 22:04 신고 수정/삭제

      네.. 질문 내용으로 봤을 때 그렇게 느껴졌습니다. 이미지가 고차원 공간에서의 한 점이 된다는 것이 잘 안받아들여지시나 봅니다..

    • PCA공부 2017.03.27 22:26 신고 수정/삭제

      이미지가 고차원공간에서 한점으로 표현되는 부분 혹시 쉽게 설명좀..부탁드려도될까요..? 죄송합니다 ㅠㅠ

    • BlogIcon 다크pgmr 2017.03.28 09:21 신고 수정/삭제

      편의상 칼라가 아닌 그레이 이미지를 가정하겠습니다. 이미지의 해상도는 가로방향의 픽셀수와 세로 방향의 픽셀수를 의미하며 예를 들어 VGA 해상도의 이미지는 640 x 480 의 픽셀로 이루어진 이미지를 지칭합니다. 그리고 각 픽셀은 0 ~ 255 사이의 밝기값(intensity)를 가집니다. 만일 2 x 1의 아주 작은 이미지가 있다고 가정합니다 (겨우 2개의 픽셀로만 이루어진). 이 때, 이 이미지의 값은 2차원 벡터로 표현될 수 있습니다 (벡터의 첫 번째 성분은 이미지의 첫번째 픽셀 밝기값, 두 번째 성분은 이미지의 두 번째 픽셀 밝기값). 유사한 방식으로 3 x 2 해상도의 이미지의 값은 6차원 벡터로 표현될 수 있습니다. 각 픽셀을 어떤 순서로 벡터로 매핑할지는 어떻게 해도 관계가 없으며 자신이 방식을 정하면 됩니다. 예컨데, 1행 1열 픽셀을 첫번째, 1행 2열 픽셀을 2번째, 1행 3열 픽셀을 3번째, 2행 1열 픽셀을 4번째, 2행 2열 픽셀을 5번째, 2행 3열 픽셀값을 6번째 원소로 하는 벡터로 설정할 수 있습니다. 이미지가 6차원 벡터로 표현된다는 말은이미지가 6차원 공간상의 한 점으로 매핑된다는 의미가 됩니다. 사람은 4차원 이상의 고차원 공간에 대해서는 가시화가 안되므로 가상의 수학적 공간을 상정하고 이미지들이 그 고차원 공간의 한 점이 된다고 상상해야 합니다.

    • PCA 2017.03.28 17:44 신고 수정/삭제

      자세히 설명해주셔서 감사합니다.
      덕분에 많이 이해가 되었습니다. 좋은 하루되세요~

  • PCA공부 2017.03.27 22:09 신고 ADDR 수정/삭제 답글

    많은 질문을 드려서 힘드셨을텐데 답변해주셔서 정말 감사드립다^^

  • PCA 2017.04.05 13:34 신고 ADDR 수정/삭제 답글

    혹시 PCA의 얼굴분석적용과 관련하여 말하는 주성분이라함은 어떤 요소인지 알수 있을까요?

    • BlogIcon 다크pgmr 2017.04.06 11:07 신고 수정/삭제

      그림 5에 있는 얼굴 이미지들이 PCA로 얻은 주성분들입니다.

  • 금융공학 2017.04.06 15:39 신고 ADDR 수정/삭제 답글

    공분산 선형변환에 대해서 왜 고유벡터가 주성분이 되는지 엄청 궁금했는데, Intuition이라기 보단 수식으로 시원하게 Q2에 적어주셨네요 !! 덕분에 궁금증 잘 풀고 갔습니다! 그런데 공분산행렬을 선형변환관점에서 보았을때 좀더 intuition하게 주성분벡터와 고유벡터를 연결해줄수 있는 고리가 없을까요 ?? 정말 잘 보고 배워갑니다 !

  • PCA감사합니다 2017.04.17 21:45 신고 ADDR 수정/삭제 답글

    안녕하세요. 매번 수학적인부분, 공학적인부분으로 도움 많이 얻어갑니다. 혹시 단순 2차원에서 PCA를 C코드로 구현해보고자하는데 얻을 수 있는 소스가 있을까요 ?

    • BlogIcon 다크pgmr 2017.04.18 18:45 신고 수정/삭제

      따로 소스는 없습니다만 pca를 직접 구현할 필요는 없다고 생각합니다. opencv에 있는 행렬 라이브러리나 eigen 등을 이용하면 됩니다. 또는 blas 나 lapack 과 같은 라이브러리를 이용해도 됩니다.

  • 대기과학 2017.04.26 16:09 신고 ADDR 수정/삭제 답글

    안녕하세요. 선형대수를 공부하는데 블로그의 글들을 통해 많은 도움이 되고 있으며 정말 감사의 인사 먼저 드립니다. 제가 궁금한 점은 이 글의 eigenface 예시에서는 RGB픽셀값을 gray로 읽어들여서 처리를 하셨는데, gray가 아닌 R,G,B값으로 즉, 여러개의 변수로 PCA 처리를 하기 위해서는 어찌해야할지 궁금하여 문의드립니다.

    • BlogIcon 다크pgmr 2017.04.26 16:40 신고 수정/삭제

      칼라 이미지에 직접 PCA를 적용하고자 할 때에는 칼라값을 그대로 적어서 벡터 데이터를 만들면 됩니다. 예를 들어 [첫번째 픽셀의 R값, 첫번째 픽셀의 G값, 첫번째 픽셀의 B값, 두번째 픽셀의 R값, 두번째 픽셀의 G값, 두번째 픽셀의 B값, 세번째..., ..., 마지막 픽셀의 B값] 이런 식으로 이미지마다 벡터 데이터를 생성한 후 PCA를 적용하면 됩니다. 이미지->벡터로 변환할 때 픽셀 순서나 R, G, B 순서 등은 아무런 관계가 없으면 일관되기만 하면 어떤 순서와 방식으로 벡터화를 해도 무방합니다. PCA로 얻어진 주성분 벡터를 다시 이미지로 해석할 때 이미지->벡터에 적용된 규칙을 그대로 벡터->이미지에 적용하면 됩니다.

    • 대기과학 2017.04.26 17:33 신고 수정/삭제

      아하..! 감사합니다! 덕분에 큰 깨달음을 얻고 갑니다!

  • 곰돌이만세^^ 2017.05.29 11:51 신고 ADDR 수정/삭제 답글

    간만에 들렀습니다~
    PCA를 활용하다가 궁금한 점이 생겼는데요.
    어떤 DB내에서 있는 이미지와 신규로 들어오는 이미지가 같은 부류인지 판별하는 알고리즘에서 피처데이터를 PCA로 차원을 줄여서 프로세싱하려고 합니다.
    문제는 시간과 효율성 때문에 차원을 줄이려는 건데 DB에 있는 영상이 너무 많아서 PCA자체 수행시간만 4~5초가 걸리는 것입니다.

    실제로 PCA를 필드에서 사용할 때 이런 부분들이 당연히 문제가 될 것 같은데, 어떻게 해결하는 지 아시는지 도움을 좀 얻을 수 있을까요?

    • BlogIcon 다크pgmr 2017.05.29 14:25 신고 수정/삭제

      네 오랜만입니다 ^^ PCA는 시간이 걸리더라도 한번만 수행하면 되기 때문에 큰 문제는 안될 것으로 생각됩니다. detector를 만들 때에도 학습에는 많은 시간이 걸리지 않습니까?

    • 곰돌이만세^^ 2017.05.29 20:48 신고 수정/삭제

      아.. 제가 질문을 애매하게 했나보군요.

      예를 들면,

      DB에 이미 5000장의 영상 및 피처가 1000개 정도 된다고 가정해보겠습니다.
      이를 PCA로 차원을 100으로 줄이고 줄어든 100개의 차원으로 DB내에 가장 유사한 영상을 찾는 것이 목적입니다. (유클리디언 디스턴스)
      그러면 총 5001장을 PCA 처리를 해야 되지 않겠습니까?

      만일 분류가 필요한 새로운 영상이 하나 더 들어왔다고 해도,
      하나의 샘플로는 PCA를 돌릴 수가 없고, 이미 존재하는 5000장과 합쳐서 다시 5001장을 PCA 처리를 또 해야 하는 상황입니다.

      이런 상황이면 한번만 처리하고 말 수가 없을 것 같아서요.

      만일 PCA대상이 되는 DB의 모수를 500장 정도로 줄인다고 하면, 이전과 다른 집합이 되므로, 주성분이 달라지거나, 구분을 위한 distance threshold가 변경될 위험이 있어보입니다.

      정리하자면
      미리 5000개의 DB에 대해서 PCA를 수행해 두더라도(한번), 새로 들어온 샘플에 대해서는 또 5000장+1장에 대한 PCA를 처리해야 하는 경우에 처리시간을 줄일 방법이 있는지 궁금합니다

    • BlogIcon 다크pgmr 2017.05.30 08:19 신고 수정/삭제

      PCA는 DB에 있는 데이터들에 대해서 한번만 수행하면 됩니다. 그리고 DB에 있는 이미지들에 대해서는 feature를 미리 계산해 놓으면 됩니다.. PCA와 KL Transform(또는 Hotelling transform)의 차이점에 대해서 알아보시면 도움이 되리라 생각합니다.

    • 곰돌이만세^^ 2017.05.30 18:10 신고 수정/삭제

      네. 감사합니다^^ 언제나 도움을 주시는 군요^^

  • 곰돌이만세^^ 2017.05.30 18:10 신고 ADDR 수정/삭제 답글

    네. 감사합니다^^ 언제나 도움을 주시는 군요^^

  • 오도 2017.07.07 18:41 신고 ADDR 수정/삭제 답글

    PCA를 이용하고 싶은 공대생입니다. 정 말 고우하는데 많은 도움이 됬습니다. 그런데 같이 공부하는 사람끼리 의견이 갈려서 문의드립니다 ㅜㅜ
    예를들어 100개의 데이터를 가진 모델이 5개가 있으면 이 모델 5개를 이용하여 PCA를 수행하면 eigenvector는 5개가 나오는 건가요?? 아님 100개가 나오는 건가요??

    • BlogIcon 다크pgmr 2017.07.07 19:13 신고 수정/삭제

      eigenvector의 개수는 데이터의 개수와는 관계없고 데이터의 차원과 관계됩니다. 2차원 데이터라면 2개가 나오고 3차원 데이터라면 3개가 나옵니다.

  • 영상이 2017.07.10 15:45 신고 ADDR 수정/삭제 답글

    올려 주신 코드 pca에서 reconstruction 할 때
    y_k = x * v_k

    x_recons = v_k * y_k';

    이 것들을 곱하는 이유가 무엇인지 알 수 있을까요?

    • BlogIcon 다크pgmr 2017.07.10 23:41 신고 수정/삭제

      이 수식들을 이해하기 위해서는 어느 정도 기본적인 수학적 공부가 필요합니다. 그러한 지식이 있다고 전제하고 아래에 나름 설명을 드리니 필요한 개념과 기본지식에 대해서는 스스로 공부를 하셔야 합니다. 특히, hotelling transform에 대해 공부를 하면 이해에 도움이 됩니다.

      pca로 얻은 고유벡터들(v1, v2, ...)은 벡터공간의 기저(basis)를 형성합니다. 따라서 입력영상 x는 이들의 일차결합으로 표현될 수 있습니다. 즉, x = c1e1 + c2e2+ .... + ckek + ck+1*ek+1 + ...
      그런데, ei들이 서로 수직이라면 일차결합 계수는 ci = x*ei로 얻어집니다. 그런데, pca로 얻어진 고유벡터들은 서로 수직이기 때문에 v_k = [e1 e2 ... ek]에 대해, y_k = x * v_k는 x를 고유벡터들의 일차결합으로 표현했을 때의 k번째까지의 계수가 됩니다. 즉, y_k = [c1 c2 ... ck]. 그리고, x_recons = v_k * y_k = c1*e1 + c2*e2 + ... + ck*ek입니다. 즉, x_recons는 원래의 x를 고유벡터들의 일차결합으로 표현한 식에서 k번째까지의 항(term)까지만 더한 값입니다. 즉, e1, ..., ek까지만 써서 x를 근사시킨 것입니다.

  • 삼성썬더스 2017.07.12 14:38 신고 ADDR 수정/삭제 답글

    글 잘보았습니다. 좋은 정보 감사합니다. 그런데 한가지 의문이 있어 이렇게 댓글 남깁니다.
    pca의 과정을 통하여 변환행렬이 만들어졌다면 출력=변환행렬*입력 이렇게 pca를 수행한다고 이해를 하였는데 이 변환행렬 자체가 이미 입력영상들로 이루어진 저차원 정보를 담고있는 것 아닌가요? 그렇다면 변환행렬*입력 이 없어도 변환행렬자체만으로도 저차원적인 정보를 담고 있지 않나요? 아니면 여기서 입력이란 pca과정에 이용되지않은 새로운 이미지인가요?

    • BlogIcon 다크pgmr 2017.07.13 08:45 신고 수정/삭제

      말씀하신 변환행렬이라는 것이 pca를 통해 구한 주성분벡터들로 이루어진 행렬이지요? 그렇다면 '출력=변환행렬*입력'에서 출력은 입력을 주성분벡터들의 일차결합으로 표현했을 때의 일차결합 계수가 됩니다. 그리고 우리는 보통 이 계수를 컴퓨터비전 응용에서는 feature라고 부릅니다. 말씀하신 변환행렬 자체가 이미 저차원의 정보를 담고 있는가에 대해서는 pca에서 말하는 '저차원'이 무엇인지를 명확히 하는 것이 중요할 것 같습니다. 입력 이미지의 크기가 20*20 이라면 데이터의 차원은 400인데요, 이러한 이미지들에 대해 pca를 수행하면 데이터의 차원과 동일한 수인 400개의 주성분 벡터들이 얻어집니다. 이들 중에서 가장 중요한 k개의 주성분 벡터만을 이용해서 변환행렬을 구성했다면 출력 = 변환행렬*입력에서 얻어지는 출력은 k차원이 됩니다 (k << 400). 즉, 원래의 400차원의 입력 데이터가 k차원의 데이터로 변환되었기에 pca를 통해 데이터의 차원을 낮출 수 있다고 말을 합니다. 그런데, 말씀하신 바는 변환행렬 자체가 이미 저차원의 정보를 담고 있지 않느냐잖아요? 의미상으로는 맞다고 생각합니다. 다만, 표현상의 문제이긴 한데, 정확히 표현하자면 저차원의 정보를 담고 있다기보다는 데이터들의 분포를 설명할 수 있는 핵심성분들(차원은 데이터와 동일)을 담고 있다고 표현하는 것이 좋을 것 같습니다. 사실 이 pca로 구한 변환행렬은 입력 데이터들의 분포를 가장 잘 설명하는 부분공간(subspace)으로 볼 수 있고, 주성분 벡터들은 이 부분공간의 좌표축(x축, y축, z축과 같은 좌표축) 역할을 합니다. 그리고, 변환행렬*입력은 입력을 이 부분공간에 매핑(투영)시켰을 때의 좌표(부분 공간에서의)를 구하는 과정과 같습니다.

  • 끄적끄적 2017.08.10 18:34 신고 ADDR 수정/삭제 답글

    다크프로그래머님 안녕하세요 :)
    매번 친절한 답변 감사드리고, 항상 많이 배우고 갑니다.
    PCA 글을 읽으면서 궁금한 점이 생겼습니다. 내가 생각한게 맞나? 싶은 것이 있어서 다크프로그래머님께 확인차(?) 여쭤봅니다ㅎㅎ

    X, Y로 이뤄진 2차원 공간에서 몇 개의 점(데이터)가 있고, PCA로 Line fitting 한다고 했을 때는 다크님께서 적어주신 것처럼 가능한데, 주성분의 개수가 2개 뿐이니까 단지 직선 근사가 전부인 것 맞나요? 즉, 최소자승법으로는 2차원에서 곡선근사가 가능한데, PCA로도 곡선 근사가 혹시 가능한가요?

    • BlogIcon 다크pgmr 2017.08.11 08:11 신고 수정/삭제

      안녕하세요. 조금 생각을 해봤습니다만 가능할 것도 같긴 한데.. 방법이 떠오르지는 않습니다. 일단 저는 방법을 모릅니다만 실제로 방법이 없는지는 잘 모르겠습니다.

  • 질문드립니다. 2017.09.15 00:54 신고 ADDR 수정/삭제 답글

    감사하게 잘 보고있습니다.
    마지막부분에 σw2 뒷부분이 왜 0이되는지 잘 모르겠습니다...

    • 질문드립니다 2017.09.15 00:58 신고 수정/삭제

      w 벡터에 프로젝션한 벡터의 크기(방향은 존재하지 않는)의 평균의 합이 왜 0이 되는지요? 항상 PCA에서 데이터의 공분산의 고유벡터의 의미가 궁금했는데 마지막 정리를 보고 이해가 갔습니다. 근데 저 합이 0이되는 부분은 잘 모르겠네요 감사합니다

    • BlogIcon 다크pgmr 2017.09.15 15:24 신고 수정/삭제

      안녕하세요. 저도 기억이 오래되어서 다시 한번 풀어보았습니다. 일단 zi*w는 두 벡터의 내적이기 때문에 +,- 값을 모두 가질 수 있습니다 (입력의 한계로 내적을 *로 표기합니다). 그리고 zi들은 평균이 0벡터가 되도록 centering된 상태임을 일단 감안하시구요. 사실 zi*w는 w를 새로운 좌표축으로 했을 때의 zi의 좌표로 볼 수 있습니다. 그리고 w를 어떻게 잡더라도 그 평균은 항상 0이 됩니다. 수식적으로 계산해 보면, zi = (x1i, x2i, ..., xmi)라 하고(m차원 벡터) w = (w1, ..., wm)이라고 하면 zi*w = x1iw1 + ... + xmiwm과 같습니다. 따라서, z1*w + z2*w + ... + zn*w = (x11+x12+...+x1n)w1 + ... + (xmn+xm2+...+xmn)wm = 0w1 + ... + 0wm = 0이 됩니다. zi의 평균이 0벡터이므로 zi의 각각의 좌표의 평균도 0이기 때문입니다.

  • 상상의힘 2017.09.17 15:36 신고 ADDR 수정/삭제 답글

    PCA 에 대한 기하학적인 직관

    다크님의 글을 읽고 저도 많은 intuition 을 얻어 가서 고민한 바를 써보겠습니다.
    먼저, eigenvector, eigenvalue 의 기학적인 의미를 생각해 본다면. 결국 선형 변환 (rotation, 길이 변환) 등을 할 때 invariant 한 방향을 나타내는 벡터, 그리고 변환을 하는 정도의 스케일의 의미를 둘 수 있습니다. [1 0 ; 0 1 ] 의 항등 변환과 [ 2 1 ; 1 2 ] 의 변환을 비교해 본다면 eigenvector 는 y=x, y=-x 상에 있다고 직관할 수 있습니다. 전, 참고로 2차원 공간이 고무막 처럼 생겼고 기저 i(1,0), k(0,1) 가 각각 i'(2,1), k'(1,2) 로 이동하면서 좌표 공간을 휘게 만든다고 생각을 합니다. 그렇게 변환시키면 변하지 않는 eigenvector 들을 직관 하기가 편하거든요.

    이렇게 선형 변환의 invariant 방향으로 eigenvector 를 직관화 한다음, 공분산 matrix 를 생각해보면, 2차원의 경우 [ (x-mx)(x-mx) (x-mx) (y-my) ; (x-mx)(y-my) (y-my)(y-my) ] 이렇게 공분산 matrix 가 나타납니다. 이 경우 데이터 분포로 이 matrix 가 만들어 진다고 하면 결국 mx, my 평균점에서 데이터 분산들을 대칭 행렬로 표시를 하게 됩니다. 가령 데이터가 x,y 방향 분산이 같은 원모양을 이룬다고 상상하면 [ (x-mx)^2 0 ; 0 (y-my)^2 ] 형태가 되어서 기저가 i, k 인 항등 변환 형태가 된다는 것을 알 수 있지요. 결국 공분산으로 만들어지는 matrix 의 eigenvector 는 위에 기하학적인 직관처럼 데이터가 많이 분산되는 방향으로 좌표 평면을 느린다고 가정해보면, 그 방향은 invariant 해져서 eigenvector 가 되고 결국 PCA 주성분 방향이 될 것으로 직관할 수 있습니다.

    제가 개인적으로 생각하는 직관이라 당연히 학문적인 background 는 없습니다. ^^

    얼굴들에서 분산이 가장 큰 주성분 방향이 오히려 기본이 기저가 되는 건 이러한 방향으로 생각을 해보면 어떨까요? Fourier transform 은 영상처리에서도 대표적으로 사용하는 t-f 변환이니 2차원 Fourier 를 가정해보면 frequency 가 가장 낮은 저주파 영역이 얼굴 형태들의 가장 큰 변화를 나타내면서 대부분의 정보를 담고 있는 기저가 됩니다. frequency 가 올라갈 수록 머리카락 같은 high frequency 를 담고 있는 영역이 미세한 차이를 나타내고 압축 등에선 생략이 가능한 정보가 되거나 노이즈 영역이지요. 결국 PCA 도 Fourier 처럼 basis 들이 서로 다른 정보량을 담고 있다고 가정하면 어떨까 합니다.

    • BlogIcon 다크pgmr 2017.09.19 08:46 신고 수정/삭제

      먼저 생각을 공유해 주셔서 감사합니다. 선형변환을 공간을 (잡아당겨서) 늘리는 변환으로 봤을 때 늘어나는 방향이 eigenvector 방향이고 늘어나는 정도가 eigenvalue이다. 그리고 공분산 행렬을 선형변환으로 보면 데이터가 분산되는 방향으로 공간을 늘리는 변환이 된다. 따라서 공분산 행렬의 eigenvector가 데이터의 분산 방향이 된다고 말씀하신 내용을 이해했습니다.
      계속 생각을 하였는데, 공분산 행렬이 데이터 분산 방향으로 공간을 늘리는 변환이 된다는 부분에서 막힘이 있습니다. 혹시 이 부분에 대해서 좀더 설명을 주실수 있으면 감사하겠습니다.
      공간을 늘린다는 생각은 하지 못하였는데 덕분에 좋은 직관을 갖게 되었습니다. 감사합니다.