save the world

pca sparse coding #01 본문

PCA, Sparse Coding

pca sparse coding #01

함안조씨 2017. 1. 17. 12:03

  연구실에서 공부하고있던 주제에 대하여 정리하여 보고자 블로그에 글을 쓰게 되었다. 교수님께서 첫번째로 주신 PCA를 구현하고자 인터넷에서 검색을 하고 찾아보다 보니 '다크프로그래머' 라는 분의 블로그에 잘 정리가 되어있어서 첫 걸음에 많이 도움이 되었다. http://darkpgmr.tistory.com/110 [선형대수학 #6] 주성분분석(PCA)의 이해와 활용. <-블로그에 가면 정리가 잘 되어있고 MATLAB구현 자료도 있음.

  이 공부가 시작된 계기는 A+ 논문 [A+ Adjusted anchored neighborhood regression for fast super-resolution_2014_ACCV] 을 읽다가 Sparse Coding이라는 주제가 나왔는데 Sparse Coding 에 대하여 공부하다 보니 이의 기초단계를 공부하기위해 지금 PCA부터 시작하고 있는 것이며 앞으로는 Proximal Gradient(Iterative Soft Thresholding [IST]) -> Accelerated Proximal Gradient (APG) -> ALM (Augmented Lagangian Method) ->ADMM (Alternating Direction Method of Multipliers) 에 대하여 이야기 해 보고자 한다. 글에서 실습하였다고 하는 부분은 모두 MATLAB으로 실습하였으며 내가 공부했던 내용들과 실습파일들 모두를 업로드 하려고 한다. 이번에 MATLAB을 이런식으로 제대로 써보는 것이 처음이며 추후에도 내가 MATLAB을 사용하는데 있어서 이 글이 많이 도움이 되었으면 좋겠고, 또한 처음 MATLAB을 배우거나 PCA 또는 Sparse Coding에 대하여 알아보고자 하는 사람에게 도움이 되었으면 좋겠다.

먼저 PCA 에 대해서 아는대로 정리하자면 방대한 데이터자료들에서 뽑아낼 수 있는 데이터들의 특징(feature)들이 다양할 것인데 어떤 feature들은 모든 데이터들을 잘 설명할 수도 있고 어떤 feature 들은 아닐 수도 있다. 이 이야기가 무슨 이야기인지 알기 위해서는 아래 그림. 1 을 보고 직관적으로 이해해보자.

그림1그림. 1

  그림. 1에서 빨간색 'X' 표시들은 어떠한 방식으로 관측된 데이터들을 의미한다. 이런 데이터들이 저렇게 분포 되어있다고 볼때 이를 가장 잘 분류할 수있는 방향이 PC1이고 두번째로 잘 분류할 수 있는 방향이 PC2라는 것이다. 예를 들어서 PC1의 직선으로만 데이터를 분리하면(PC1축에 모든 데이터들을 projection 시켰다고 생각해보자.) 각각의 데이터들이 조금씩 떨어져 있는것을 예상해 볼 수 있다. 반면에 데이터들을 PC2축으로만 분리하면 (PC2축에 모든 데이터들을 projection 시켰다고 생각해보자.) PC1축에 projection 시킨것과는 대조적으로 데이터들이 비교적 촘촘하게 분포하게 될 것을 예상 할 수 있다. 따라서 데이터들을 분류할 때 하나의 축으로만 설명하라고 한다면 PC1축을 사용하는 것이 가장 좋을것이고 2개를 사용하라고 한다면 PC1과 PC2 모두를 사용하는 것이 좋을 것이다. 만약 z 축 방향으로 PC3가 하나 더 있다고 생각해보자.

그림. 2

  그림. 2에서 추가된 PC3축이 데이터들을 어떻게 분류 할까?
PC3 축으로 위의 그림의 데이터들을(2차원 평면에 있는 데이터) 설명하려고 한다면 단 하나도 제대로 설명 할 수 없을것이다. 평면상에 있는 데이터들은 z 축이 모두 0이기 때문이다.

  PCA에서 좋은 feature(여기서는 축)를 결정하기 위해서는 데이터 분포를보고 가장 분산이 큰 방향을 PCA의 가장 좋은 feature로 결정하고 그다음 좋은 feature는 두번째로 분산이 큰 방향으로 결정한다. 지금처럼 차원이 2차원 또는 3차원일 때 어떻게 PCA를 이해하면 좋을지 정리해 보았다.

'PCA, Sparse Coding' 카테고리의 다른 글

pca sparse coding #02  (0) 2017.01.17