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

수학 이야기 2013. 11. 8. 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 다크 프로그래머


  • 이전 댓글 더보기
  • 밍키 2017.11.08 13:58 ADDR 수정/삭제 답글

    설명을 친절하게 다 달아주셔서 이해하는데 많은 도움이되었습니다. 감사합니다.^^

  • 밍키 2017.11.08 15:59 ADDR 수정/삭제 답글

    죄송한데 질문하나만 더 남기겠습니다. 개가 10 마리있을경우 분산이 제일큰 것을 찾는다면. 공통적인부분보다. 공분산이제일크므로 각 개들의 개성적인부분만이 남아있을텐데 어찌 공통적인 데이터가 공분산이 제일큰것인가요. 제생각대로라면 분산이 제일크다면 데이터간의 거리가 멀기때문에. a라는 개를 찾을때 b.c.d개 와 떨어져있고 a에 가까운개를 찾는것아닌가요? 분산이 제일크다는것이 이 a. b. c. d라는 개를 그래프에서 가장 서로 떨어져있을때를 말한다고생각하는데 어찌 그것이 공통적인부분을 나타내는지 궁금합니다

    • BlogIcon 다크pgmr 2017.11.08 17:06 신고 수정/삭제

      말씀하신 부분은 저도 초기에 혼란스러워했던 부분인데요, 본문에 4. 생각할 점에서 Q1의 내용이 관련 내용입니다. 관련 설명 내용을 한번 읽어보시면 좋을 것 같습니다.

  • 공대생공돌이 2017.12.06 14:20 ADDR 수정/삭제 답글

    연구중에 많은 도움되었습니다^^ 종종들리겠습니다 감사합니다

  • 2017.12.15 00:01 ADDR 수정/삭제 답글

    비밀댓글입니다

    • BlogIcon 다크pgmr 2017.12.15 08:30 신고 수정/삭제

      개념적으로 많은 사람들이 혼동스러워하는 부분입니다.
      먼저, 데이터의 개수에 관한 부분인데 평균, 분산, 표준편차 등은 데이터 1개에 대한 개념이 아니라 데이터가 여러 개 있을 때 이들의 분포에 대한 특징을 나타내는 값입니다. 만일 데이터가 1개라면 평균은 데이터와 동일한 값, 분산은 0, 표준편차도 0이 됩니다.
      두번째, 분산(공분산)을 구하기 위해서는 데이터가 무엇인지를 먼저 정의해야 합니다. 만일 190 * 190 이미지를 하나의 데이터로 본다면 이미지 한장은 190 * 190 = 36,100차원 벡터가 되며 이러한 이미지가 여러 개 있어야 의미있는 공분산 계산이 가능해집니다. 그리고 여기서 나오는 공분산 행렬은 36,100 * 36,100 크기의 행렬이 됩니다. 만일 이미지를 구성하는 픽셀값을 데이터로 정의한다면 픽셀값 1개는 1차원 데이터이며 이미지 한장을 구성하는 (총 36,100개의) 각각의 픽셀이 하나의 데이터가 됩니다. 그리고 여기서 계산되는 공분산 행렬은 1 * 1 행렬이 됩니다. 즉, 그냥 우리가 흔히 아는 분산이 됩니다. 또는, 만일 이미지를 구성하는 각 행을 하나의 데이터로 보고 각각의 행들 사이의 분산을 구한다고 하면 이때 데이터의 차원은 190이 되고 이러한 데이터가 190개 있는 셈입니다. 그리고 이 경우, 공분산 행렬은 190 * 190 행렬이 나올 것입니다.
      마지막으로,... 특별한 문제가 없다면 댓글은 공개댓글로 부탁합니다.

    • 김대수 2017.12.17 04:06 수정/삭제

      그럼 위에서 말씀하신 데이터는 사진의 갯수 즉 50장의 사진을 가지고 있다면 데이터의 갯수는 50개가 되고 100장의 사진이있다면 100개의 데이터를 가지게 되는것은 알겠습니다. 제가 이미지의 object가 왼쪽으로 또는 오른쪽으로 돌아간 이미지 있어서 이것을 정방향으로 돌려주려고 공분산행렬을 구하는 것인데 이때는 공분산 행렬의 크기가 어떻게 될까요....? 이미지는 총190개 있다고 가정하겠습니다. 매번 도움을 주셔서 감사합니다.

    • BlogIcon 다크pgmr 2017.12.17 07:26 신고 수정/삭제

      재미있는 아이디어 같네요. 혹시 어떻게 해서 공분산 행렬로 정방향 회전이 가능한지 여쭤봐도 될까요. 언뜻 보기에는 36,100 x 36,100 행렬이 나올것 같은데요, 정확한 것은 어떤 식으로 이미지가 이용되는지를 알아야 할 것 같습니다.

  • 도우너 2018.03.27 13:56 ADDR 수정/삭제 답글

    안녕하세요. 글을 읽다가 기초적인 부분이 이해가 안되서 글남기게 되었습니다.
    위에서 벡터 hi = (zi·w)w 라고 정의해 주셨는데요, 왜 이렇게 정의 되는지 잘 모르겠습니다 (hi = (zi·kw)w (k는 scalar값) 이면 이해를 할 수 있을 것 같긴합니다만..). 좀 더 쉽게 질문드리자면 zi와 w의 내적이 어떻게 hi의 크기가 될 수 있는지를 알려주시면 될 것 같습니다. 감사합니다.

    • BlogIcon 다크pgmr 2018.03.27 14:45 신고 수정/삭제

      zi·w = |zi||w|cos(theta) 인데, |w|=1이므로(w는 단위벡터) zi·w = |zi|cos(theta)가 됩니다. 즉, zi를 w에 projection시킨 크기가 됩니다..

    • 도우너 2018.03.27 20:36 수정/삭제

      감사합니다 ^^

  • 둘리 2018.04.25 05:15 ADDR 수정/삭제 답글

    이미지 인식기를 만드는데 PCA classifier로 인식기를 만들어야 하는데 자료가 많이 안나와있어서 그러는데 혹시 설명한번 부탁드릴 수 있을까요?

    • BlogIcon 다크pgmr 2018.04.25 07:34 신고 수정/삭제

      PCA classifier(?)로 이미지 인식기를 만든다는 것이 어떤 것인지 언뜻 감이 안오네요. 생각하시는 방향이 어떤 건가요? 그리고 classifier로는 다른 방법들도 많을 것 같은데 PCA를 사용하고자 하는 이유가 무엇인지도 궁금합니다. PCA는 classifier라기 보다는 데이터의 차원을 줄이는 용도가 주 용도라서..

  • 욜로 2018.04.27 01:52 ADDR 수정/삭제 답글

    안녕하세요! 글을 읽다가 이해가 안되는 부분이 있어서 글을 남기게됐습니다. "입력 데이터 zi들의 분산을 최대화하는 방향은 결국 프로젝트된 벡터 hi의 크기인 (zi·w)의 분산을 최대화시키는 w를 찾는 문제와 동일하다." 라는 부분이 잘 이해가 되지 않는데 혹시 조금 더 설명을 해주실 수 있으신가요?

    • BlogIcon 다크pgmr 2018.04.27 08:59 신고 수정/삭제

      네, 설명에서 어떤 부분이 잘 이해가 안가시나요? zi·w는 내적의 정의에 의해 zi·w = |zi||w|cos(theta)인데 w가 단위벡터이므로 zi·w = |zi|cos(theta)가 됩니다. 즉, 벡터 zi를 w 방향에 투영시킨 벡터의 길이가 됩니다. 이 값(길이)은 벡터 w를 새로운 좌표축(x축, y축처럼)으로 한 1차원 좌표로 볼 수 있습니다. 따라서, 데이터들의 분산이 최대인 방향을 찾는 문제는 투영된 좌표들의 분산이 최대가 되는 축을 찾는 문제로 풀 수 있다는 의미입니다. 만일 위 설명이 궁금하신 포인트와 다르다면 한번 더 댓글을 남겨주시기 바랍니다.

    • 욜로 2018.04.27 17:23 수정/삭제

      Q1. "zi의 분산"이라는 개념을 평균을 원점으로 했을 때, 평균과 가장 먼 거리라는 개념으로 이해했는데 맞는건가요?
      Q2. "(zi·w)"와 "분산"이라는 개념은 알고 있는데, "(zi·w)의 분산"이라는 개념을 명확하게 이해 못하고 있는것 같습니다 .
      Q3. "투영된 좌표들의 분산이 최대가 되는 축을 찾는다"는 것은 max(||zi||)라는 건가요?

    • BlogIcon 다크pgmr 2018.04.27 17:44 신고 수정/삭제

      분산은 데이터들이 흩어져 있는 정도(산포도)를 나타내는 방법 중 하나입니다. 분산은 데이터 하나 하나에 대해 정의되는 값이 아니라 데이터 집합(분포) 전체에 대해 정의되는 값입니다. 어떤 집합의 데이터들이 촘촘히 모여있으면 분산이 작고 흩어져 있으면 분산이 큽니다.

    • 정현수 2018.04.28 01:49 수정/삭제

      아 처음에 댓글달아주셨던 부분이 이제야 이해가 됐네요; 감사합니다!

  • 해파리 2018.05.09 19:36 ADDR 수정/삭제 답글

    안녕하세요. 좋은 글 작성해주셔서 정말 감사합니다.
    글을 읽고 올려주신 소스코드도 돌려보았는데요, 사용하신 이미지는 크기가 45 x 40 이기 때문에 고유벡터(=고유얼굴)를 구하면 1800 x 1800 의형태로 나오고 이 1800개의 1800차원 벡터 중 20개를 시각화하면 올려주신 이미지(<그림 5>)가 나온다는 것은 이해했습니다.

    그런데 이미지의 크기가 커질 경우에는 공분산행렬의 크기가 엄청 커지게 되고 이때 계산량이 많아져 제대로 작동하지 않는데 이럴 때에는 어떻게 해야 할까요?

    예를 들어, 이미지의 크기가 100 x 100 이면 공분산행렬의 크기는 10,000 x 10,000이 되고 이 행렬의 고유벡터를 구하는 것은 무리가 있어 보입니다. 어떤 방식으로 해결할 수 있을까요?

    • BlogIcon 다크pgmr 2018.05.09 20:59 신고 수정/삭제

      인터넷에 관련 이슈가 꽤 있으니 한번 구글링을 해 보시면 좋을 것 같습니다. 저도 찾아보니 공분산행렬을 직접 구하지 않고 SVD를 이용해서 PCA 분석이 가능한 것 같습니다. https://math.stackexchange.com/questions/3869/what-is-the-intuitive-relationship-between-svd-and-pca#3871 글을 참조하시기 바랍니다.

    • 해파리 2018.05.16 21:40 수정/삭제

      답변 정말 감사합니다. 확인을 오랬동안 못했었네요ㅠ 링크달아주신 글은 읽어봤는데 수학이 약해서 잘 이해가 안되네요ㅠㅠ

      찾아보니까
      Paul, Liton Chandra, and Abdulla Al Sumam. "Face recognition using principal component analysis method." International Journal of Advanced Research in Computer Engineering & Technology (IJARCET) 1.9 (2012): pp-135.

      여기 3번째 section에 관련 내용이 나오네요. 한번 읽어보셔도 좋을것 같습니다.

      항상 글 보면서 공부 많이하고 있습니다. 감사합니다^^

    • BlogIcon 다크pgmr 2018.05.18 19:10 신고 수정/삭제

      네 감사합니다

  • 대학원생1 2018.05.19 17:59 ADDR 수정/삭제 답글

    정말 감사합니다 매우 궁금해하던부분이었는데 덕분에 궁금증이 해결되었습니다!
    다른 좋은 포스트들도 많이 올려주셨던데 자주 참고하며 공부하고 있습니다
    감사합니다~^^
    블로그에 퍼 가고 싶은데 괜찮을까요?

  • 냥냥이 2019.03.15 11:39 ADDR 수정/삭제 답글

    안녕하세요! 항상 다크프로그래머님 글 정독중입니다. 이번 포스트 보며 의문가는 점이 있어 답글 남깁니다. "<그림 10> PCA 계산과정"에서 맨 하단에 ek가 가장 분산이 큰 방향이라고 적혀 있는데, e1이 가장 큰것이므로 ek는 가장 분산이 작은 것이 되어야 하지 않나요???

    • BlogIcon 다크pgmr 2019.03.16 01:43 신고 수정/삭제

      네, e1이 가장 분산이 큰 방향이 맞습니다. 그런데, 글의 내용을 자세히 보시면 ek는 "e1, ..., ek-1과 동시에 수직"이면서 분산이 가장 큰 방향이라고 되어 있습니다. e1, ..., ek-1에 선점되지 않고 남은 방향 중에서 분산이 가장 큰 방향이라는 의미입니다.

  • 수호 2019.06.02 22:09 ADDR 수정/삭제 답글

    학교 수행평가로 주성분 분석에 대해 설명하고자 하는데, 블로그 글이 도움 많이 되었습니다.

    본문에 올려주신 코드를 파이썬으로 바꾸어서 코딩하고 있는 중인데...(제가 matlab을 잘 모르는 데다가 그냥 가져다가 쓰면 제가 했다는 맛이 안 나서요...)
    공분산 행렬을 구하고 공분산 행렬의 고유벡터를 구하는 것까진 성공한 것 같으나 이게 단위벡터다 보니까 성분들의 크기가 너무 작아서 이미지로 바꾸려면 0~255 사이의 값으로 보정을 해야할 거 같더군요....
    혹시 이걸 보정할만한 방법이 있는지 여쭈어 보고 싶습니다 ㅠㅠ 처음엔 그냥 값들에 10000을 곱해봤는데, 값 자체는 0에서 255 사이로 나오지만 이미지를 출력해보니 완전 이상한 이미지가 나오더라구요...ㅠㅠ

    혹시 파이썬으로 이 값들을 보정할만한 방법을 아신다면 도움 주시면 정말 감사할 것 같습니다!

    • BlogIcon 다크pgmr 2019.06.02 23:30 신고 수정/삭제

      최소값이 0, 최대값이 255가 되도록 linear하게 스케일변환하면 됩니다. scaled_data = 255 * (data - min{data}) / (max{data} - min{data})

    • 수호 2019.06.03 20:31 수정/삭제

      와....덕분에 해결했습니다!

      근데 뭐때문인진 모르겠지만

      scaled_data = 255 * (data - min(data)) / (max(data) - min(data))

      여기서 (max(data) - min(data))으로 나누니 흑백이 반전되어서 나오더라고요...

      그래서 그냥 아무 생각 없이 (min(data) - max(data))으로 나누었는데 해결 된 거 같아요..

      근데 (min(data) - max(data)) 으로 나누면 값 전체가 음수가 될텐데 왜 해결됐는지는 미스테리...

    • 수호 2019.06.03 23:19 수정/삭제

      아...제가 잘못 했었네요. 뭔가 이상하길래 알려주신대로 다시 하니까 정상적으로 나오네요!

      근데 첫번째 eigenface는 알려주신대로 한게 더 이상한건 기분탓...이겠죠...?

  • bluecanvus 2019.07.11 00:07 ADDR 수정/삭제 답글

    멋진분이시다.. 구글링하다 우연찮게 봤는데 정리 잘 해두셨네요~ 많은 도움이 되었습니다. 감사합니다 :)

  • 사랑해요다크 2019.11.19 20:17 ADDR 수정/삭제 답글

    pca와 svd 차이점이 궁금해서 찾아보다가
    저와 비슷한 생각을 하신 분의 글이 있어서
    여기에 질문드립니다.

    본문:
    먼저 PCA와 SVD의 차이에 관해서 입니다.
    PCA는 어떤 행렬 A의 공분산 행렬에 대한 고유값과 고유벡터를 구하고 결국 최종적으로는 상위 n개의 고유값에 해당하는 고유벡터만을 추려내어 차원 축소를 하는 것으로 알고 있습니다.
    이것이 지니는 의미는 각 데이터의 분산을 최대치로 하는 직교 좌표들을 구하고 이 직교 좌표들 중 분산을 보다 크게 하는 상위권 n개의 좌표들을 제외한 나머지 좌표들은 생략하는 것, 즉 데이터를 충분히 잘 표현하는 범위 내에서 차원을 축소하는 것으로 알고 있습니다.
    SVD의 경우 행렬 A 자체에 대해서 분해를 수행하여 UΛVt (Vt는 행렬 V의 전치행렬) 로 표현하고 이 때 Λ는 U와 Vt에 대한 고유값들의 양의 제곱근으로 이루어져있는데 역시 마찬가지로 고유값이 낮은 애들부터 순차적으로 제거해가면서, 즉 PCA처럼 상위 n개의 고유값에 해당하는 고유벡터만을 추려내어 A를 다시 표현하는 것으로 알고 있습니다.
    결국 PCA와 SVD 둘 다 상위 n개의 고유값에 해당하는 고유벡터들을 추림으로써 차원 축소를 하는 방법인데요,
    만약 어떤 행렬 A가 m개의 고유값과 m개의 고유벡터를 지니고 있을 때 상위 n개(n<m)의 고유값에 해당하는 고유벡터만을 추려내어 차원 축소를 한다고 가정할 때, PCA로 차원 축소한 결과와 SVD로 차원 축소한 결과가 결국 같은 것인가요?
    결과는 같고 단순한 방법에만 차이가 있는 것인지, 아니면 실제로 방법에도 차이가 있고 결과에도 차이가 있는 것인지 궁금합니다.

    출처:https://okky.kr/article/519233

    • BlogIcon 다크pgmr 2020.02.24 12:52 신고 수정/삭제

      안녕하세요. PCA와 SVD의 몇 가지 차이점을 정리해 보는 것이 질문하신 내용을 이해하는데 도움이 될 것 같습니다.
      - SVD는 행렬에 대해 적용하는 것이지만 PCA는 행렬에 대해 적용하는 것이 아니다.
      - PCA는 데이터들의 공분산 행렬에 대해 고유분해를 적용해서 주성분들을 추출하는 과정이다
      - 행렬이 정방행렬이 아닌 경우에는 고유분해(대각화)를 할 수 없는데, 정방행렬이 아닌 경우에 근사적으로 고유분해를 적용하는 과정이 SVD이다

  • 사랑해요다크2 2020.01.05 02:12 ADDR 수정/삭제 답글

    제가 본 글 중 최고입니다 감사합니다

  • 소행성 2020.04.23 15:43 ADDR 수정/삭제 답글

    1.
    고유벡터를 뽑아 오는 거까지는 이해가 갑니다.
    그런데 고유벡터의 개수가 2개이면 픽셀은 2픽셀짜리가 되는게 아닌가요?

    2.
    PCA로 얻은 주성분 벡터들을 e1, e2, ..., en라면 임의의 n차원 데이터 x는 x = c1e1 + c2e2 + ... + cnen과 같이 ei들의 일차결합으로 표현될 수 있다 (이 때, 상수계수 ci들은 x와 ei의 내적 즉, ci = x·ei로 계산할 수 있으며 이와 같이 어떤 데이터 집합의 데이터들을 그들의 주성분 벡터들의 일차결합으로 표현하는 것을 Karhunen–Loève transform (KLT) 또는 Hotelling transform이라 부른다).

    여기서 c1e1은 그럼 x·e1·e1인가요?

    • BlogIcon 다크pgmr 2020.04.24 00:05 신고 수정/삭제

      1은 질문 내용이 어떤건지 잘 이해가 안가네요..
      2는 c1e1은 (x·e1)*e1 입니다. 처음의 · 은 dot product(내적)이고 두번째 *는 곱하기입니다.

  • 건전지a 2020.09.22 11:49 ADDR 수정/삭제 답글

    안녕하세요 잘 보았습니다 ㅎㅎ
    위에서 PCA와 SVD를 정리해주셨는데, 데이터의 공분산행렬은 항상 정방행렬(nxn)이 아닌지요? 혹시 공분산행렬 C가 정방행렬임에도 불구하고 singular matrix라서 eigenvalue-decomposition이 불가능한 경우에 SVD를 이용하는건지 궁금합니다.

    • BlogIcon 다크pgmr 2020.09.22 11:59 신고 수정/삭제

      ('위'가 어딜 말하는 건지 한참 찾았네요...)
      PCA는 데이터의 분포를 분석하는 방법이고 SVD는 행렬을 분해하는 것이라 서로 비교의 대상이 되지 않습니다. PCA는 ICA 등과 비교를 해야 하고, SVD는 LU decomposition, eigendecomposition 등과 비교를 하는 게 레벨이 맞겠습니다.
      그리고 공분산행렬은 정방행렬이자 대칭행렬이라서 항상 고유분해가 가능합니다.

    • BlogIcon 건전지a 2020.09.22 15:09 수정/삭제

      아하 제가 PCR 모형을 다룬 논문 중에서 SVD를 사용한 것을 본 적이 있어 헷갈렸나 봅니다.
      해당 논문에서는 X'X = VWV' (V: eigenvector 행렬 / W : eigenvalue 대각행렬)로 분해하는 주성분분석 대신 특이값 분해를 통해 X = USV' (U: XX'를 eigenvalue-decomposition한 orthogonal matrix / S : eigenvalue의 제곱근 대각행렬)를 구합니다.
      결국은 시작하는 방식은 다르지만 X'X = (USV')'(USV') = VWV'가 된다는 PCA와 SVD의 관계를 설명한 내용이었습니다.

      (참고한 논문 : 경민정, 주성분 회귀모형의 베이지안 분석, 한국데이터정보과학회지 30, 2019)

  • BlogIcon 왈왈가부 2020.10.28 20:07 신고 ADDR 수정/삭제 답글

    좋은 글 너무 감사합니다. 대박이네요.

    몇 가지 질문을 드려보고 싶습니다.

    우선 첫 번째로.
    [ 즉, PCA로 얻은 주성분 벡터들을 e1, e2, ..., en라면 임의의 n차원 데이터 x는 x = c1e1 + c2e2 + ... + cnen과 같이 ei들의 일차결합으로 표현될 수 있다 (이 때, 상수계수 ci들은 x와 ei의 내적 즉, ci = x·ei로 계산할 수 있으며 이와 같이 어떤 데이터 집합의 데이터들을 그들의 주성분 벡터들의 일차결합으로 표현하는 것을 Karhunen–Loève transform (KLT) 또는 Hotelling transform이라 부른다)]

    해당 부분에서 임의의 n차원 데이터 x는 본래 이미지 데이터셋 1800 * 20이라고 이해해도 될까요?
    그리고 해당 식은 (x@ei)*ei 는 본래 데이터 x를 주성분 ei로 도출하는 식이 맞나요?

    두 번째로는 모든 고유벡터에 해당되는 주성분의 합이 데이터의 차원수 즉, 1800개가 되는 것이 맞을까요?

    • BlogIcon 다크pgmr 2020.10.28 22:26 신고 수정/삭제

      답변만 간단히 드릴께요.
      - x는 데이터셋 아니고 데이터입니다. 1800차원 벡터로 보시면 됩니다.
      - 네, ei는 1800개가 얻어집니다. 그런데, 이 문제의 경우에는 데이터의 개수가 20개밖에 안되어서 앞의 주성분 몇개를 제외하고는 나머지는 노이즈라 생각해도 무방합니다. ei의 계수 ci를 보면 되는데요, ci값이 작은(0에 가까운) ei들은 노이즈라 보면 됩니다..

    • BlogIcon 왈왈가부 2020.10.29 11:57 신고 수정/삭제

      아 답변 감사드립니다.
      질문하나만 더드리겠습니다!
      그리고 모든 1800개의 고유값을 더하면 그 값이 1800으로 나오는 것으로 이해했는데 맞을까요?
      예를들어 그래서 주성분 10개를 선택하면 n=1,2,3...9,10일때 고유값의 합 / 1800
      으로 설명력을 구하는 것으로 알고 있어서요!

    • BlogIcon 다크pgmr 2020.10.30 06:25 신고 수정/삭제

      그렇지 않습니다. pca를 통해 얻어지는 주성분 벡터들은 데이터들이 분포의 주요한 방향들을 나타내는 방향벡터들이고, 고유값은 대응되는 주성분 벡터들 방향으로의 데이터의 분산(variance)을 의미합니다. 따라서, 고유값의 크기는 해당 데이터의 분포에 따라 달라지는 값이기 때문에 그 값들의 합이 데이터 차원과 같아지지는 않습니다.
      설명력을 구하고자 한다면 데이터 차원으로 나누는 것보다는 전체 고유값들의 합으로 나누는 것이 좋겠습니다. 전체 고유값들의 합은 공분산행렬(covariance matrix)의 대각 원소들의 합으로 손쉽게 계산할 수 있습니다.

    • BlogIcon 왈왈가부 2020.11.01 15:25 신고 수정/삭제

      친절한 답변 감사합니다!!

  • 별난사람 2020.12.29 10:52 ADDR 수정/삭제 답글

    좋은 설명 감사합니다.

    통계학과 수학에 약한 저에겐 너무나 어렵지만...열심히 공부해볼게요 ㅠㅠ

  • 통통 2021.01.08 23:42 ADDR 수정/삭제 답글

    안녕하세요. 좋은 글 잘 읽었습니다.
    질문 하나만 드리겠습니다.
    20명의 얼굴이 각각 1800 길이의 벡터로 표현되었고, 즉 20개의 길이 1800짜리 벡터로 표현된 데이터가 있는 상태인데요.
    PCA를 수행하면 길이 1800짜리 주성분 벡터들이 1800개 얻어지는 것까지 이해가 됩니다.
    이 주성분 벡터들을 다시 이미지로 해석한 것이 eigenface라고 하셨는데, 여기서 eigenface의 정의가 잘 이해가 안갑니다.
    각 주성분 벡터를 eigenface라고 이해해보았는데, 만약 이것이 맞다면 분산이 큰 20개의 주성분 벡터를 가지고 <그림5>처럼 다시 이미지를 어떻게 구성하는 것인가요?
    20개만 활용한다면 각 얼굴에 대해 길이 20 벡터의 데이터가 얻어질텐데 어떻게 원래 사이즈의 이미지가 만들어지는건가요?

    • BlogIcon 다크pgmr 2021.01.13 12:46 신고 수정/삭제

      안녕하세요. PCA로 얻어진 주성분 벡터들은 모두 1800차원 벡터들입니다. 그중 가장 dominant한(대응되는 고유값이 큰) 것들을 활용한다는 의미입니다. 즉, 1800차원 벡터들 20개를 사용한다는 의미입니다.

  • BlogIcon ^&^ 2021.07.13 19:17 신고 ADDR 수정/삭제 답글

    머신러닝 관련 서적을 읽다가 다크프로그래머님 블로그를 참고하라고 주석에 써져 있어 타고타고 흘러들어왔는데요,, 선형대수학과 통계 베이스가 약해서 아주 기초 수준의 질문이 생기게 되어 댓글 남기게 되었습니다. 4. 생각할 점 밑의 (글 가장 하단부) [Q2. 왜 공분산행렬의 고유벡터가 데이터 분포의 분산 방향이 되고, 고유값이 그 분산의 크기가 되는 것일까? ] 부분의 설명에서 zi·w 의 분산을 정리하는 과정에서 (zi·w)^2의 제곱의 합(시그마)가 어떻게 그 아랫줄인 (zi·w)의 전치행렬·(zi·w) 넘어가는지,, 다른 pca 유도 설명이나 유투브를 보아도 기초적인 것이라 그런지 설명이 되어있지 않아서, 혹시 답변해주실 수 있다면 감사할 거 같습니다,, 기계학습을 공부하기 이전에 선형대수학을 제대로 공부하고 넘어가야했었는데,, ㅠㅠ 힘드네요

    • BlogIcon 다크pgmr 2021.07.14 23:22 신고 수정/삭제

      ∑(zi∙w)^2에서 (Zw)^T(Zw)로 넘어가는 것이 쉬운 것은 아니지만 (Zw)^T(Zw)를 전개해 보면 ∑(zi∙w)^2이 나온다는 것은 쉽게 확인할 수 있습니다. Zw = [z1∙w z2∙w ... zn∙w]^T인 열벡터이며, ∑(zi∙w)^2 = ||Zw||^2 = (Zw)^T(Zw) 입니다.