전산물리학:주성분_분석

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
전산물리학:주성분_분석 [2019/05/13 17:16] admin전산물리학:주성분_분석 [2019/05/14 19:18] – [이론] admin
Line 1: Line 1:
-======개요======+:======개요======
 주성분 분석(principal component analysis)란 데이터를 독립적인 성분들로 분해하는 기법이다. 분산이 큰 방향부터 순서대로 주축(principal axis)를 구한 다음, 몇 개의 주축들만을 사용해 데이터를 압축해서 표현할 수 있다. 주성분 분석(principal component analysis)란 데이터를 독립적인 성분들로 분해하는 기법이다. 분산이 큰 방향부터 순서대로 주축(principal axis)를 구한 다음, 몇 개의 주축들만을 사용해 데이터를 압축해서 표현할 수 있다.
  
Line 35: Line 35:
 위의 공분산 행렬을 대각화하였을 때 얻는 고유값 $\lambda_1 \ge \lambda_2 \ge \ldots \ge \lambda_M$이 있고 이에 해당하는 고유 벡터 $\hat{e}_1, \hat{e}_2, \ldots, \hat{e}_M$들이 있는데 이 고유 벡터들이 주축의 방향을 가리킨다. 위의 공분산 행렬을 대각화하였을 때 얻는 고유값 $\lambda_1 \ge \lambda_2 \ge \ldots \ge \lambda_M$이 있고 이에 해당하는 고유 벡터 $\hat{e}_1, \hat{e}_2, \ldots, \hat{e}_M$들이 있는데 이 고유 벡터들이 주축의 방향을 가리킨다.
  
-각각의 관찰은 $[R_{1n}\ldotsR_{Mn}]^T = \vec{u} + \sum_{m=1}^M g_{nm} \hat{e}_m$처럼 평균 중심에서 주축 방향들로 전개하여 적을 수 있다.+다음처럼 예제 코드를 적을 수 있다. sklearn.datasets로부터 iris 데이터를 읽어들여서 이 중 $M(=3)$차원 데이터 $N(=100)$개를 사용하자. 주성분 분석으로 얻어진 2개의 주축만을 취하고모든 데이터를 이 방향으로 사상시켜서 그린다. 이는 원래의 3차원 데이터를 2차원으로 압축하는 것에 해당한다. 
 + 
 +<Code:python> 
 +from __future__ import print_function,division 
 +from pylab import scatter,show 
 +from sklearn.datasets import load_iris 
 +from numpy.linalg import eigh  # for Hermitian or symmetric matrices 
 + 
 +iris = load_iris() 
 +M, N = 3, 100 
 +R_transpose = iris.data[:N, :M# R^T: N*M matrix 
 +R_transpose.mean(axis=0)    # average components 
 +X_transpose = R_transpose - u 
 + 
 +X_transpose.T.dot(X_transpose)/(X_transpose.shape[0]-1) # XX^T/(N-1) 
 +eigenvalues, eigenvectors = eigh(Q) 
 +u0 = eigenvectors[:,M-1] # 1st principal axis 
 +u1 = eigenvectors[:,M-2] # 2nd principal axis 
 +scatter(R_transpose.dot(u0),R_transpose.dot(u1)) 
 +show() 
 +</Code> 
  
 =====특이값 분해와의 관계===== =====특이값 분해와의 관계=====
 특이값 분해(singular value decomposition)를 사용하면 $M \times N$ 행렬 $X$를 $X = U D V^T$로 분해할 수 있다. 이 때 $U$는 $M \times M$ 직교행렬, $V$는 $N \times N$ 직교행렬, 그리고 $D$는 대각행렬이다. $U$의 열들은 $X X^T$의 고유 벡터, 그리고 $V$의 열들은 $X^T X$의 고유 벡터들이다. 특이값 분해(singular value decomposition)를 사용하면 $M \times N$ 행렬 $X$를 $X = U D V^T$로 분해할 수 있다. 이 때 $U$는 $M \times M$ 직교행렬, $V$는 $N \times N$ 직교행렬, 그리고 $D$는 대각행렬이다. $U$의 열들은 $X X^T$의 고유 벡터, 그리고 $V$의 열들은 $X^T X$의 고유 벡터들이다.
  
 +특이값 분해를 사용하면 더 간결하게 적을 수 있다.
 +<Code:python>
 +from __future__ import print_function,division
 +from pylab import scatter,show
 +from sklearn.datasets import load_iris
 +from numpy.linalg import svd
 +
 +iris = load_iris()
 +M, N = 3, 100
 +R_transpose = iris.data[:N, :M] # R^T: N*M matrix
 +u = R_transpose.mean(axis=0)    # average components
 +X_transpose = R_transpose - u
 +
 +U, D, V_transpose = svd(X_transpose.T, full_matrices=False) #U: M*M,   V: N*N
 +scatter(V_transpose[0,:], V_transpose[1,:])
 +show()
 +</Code>
 +
 +V_transpose의 행 벡터들(= V의 열 벡터들)을 바로 그려도 앞의 코드와 정성적으로 같은 결과를 얻는 까닭은, 특이값 분해에서 다음 관계가 성립하기 때문이다:
 +$$ X \hat{v}_i = \sigma_i \hat{u}_i \longleftrightarrow X^T \hat{u}_i = \sigma_i \hat{v}_i.$$
  
  
  
 +======참고문헌======
 +  * https://plot.ly/ipython-notebooks/principal-component-analysis/
 +  * https://darkpgmr.tistory.com/106
 +  * https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.svd.html
  • 전산물리학/주성분_분석.txt
  • Last modified: 2023/09/05 15:46
  • by 127.0.0.1