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

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 23:37] admin전산물리학:주성분_분석 [2019/05/14 19:18] – [이론] admin
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$들이 있는데 이 고유 벡터들이 주축의 방향을 가리킨다.
  
-다음처럼 예제 코드를 적을 수 있다. sklearn.datasets로부터 iris 데이터를 읽어들여서 이 중 $N=3$인 데이터 $M=100$개를 사용하자. 주성분 분석으로 얻어진 2개의 주축만을 취하고, 모든 데이터를 이 방향으로 사상시켜서 그린다. 이는 원래의 3차원 데이터를 2차원으로 압축하는 것에 해당한다.+다음처럼 예제 코드를 적을 수 있다. sklearn.datasets로부터 iris 데이터를 읽어들여서 이 중 $M(=3)$차원 데이터 $N(=100)$개를 사용하자. 주성분 분석으로 얻어진 2개의 주축만을 취하고, 모든 데이터를 이 방향으로 사상시켜서 그린다. 이는 원래의 3차원 데이터를 2차원으로 압축하는 것에 해당한다.
  
 <Code:python> <Code:python>
Line 51: Line 51:
 Q = X_transpose.T.dot(X_transpose)/(X_transpose.shape[0]-1) # XX^T/(N-1) Q = X_transpose.T.dot(X_transpose)/(X_transpose.shape[0]-1) # XX^T/(N-1)
 eigenvalues, eigenvectors = eigh(Q) eigenvalues, eigenvectors = eigh(Q)
-v1 = eigenvectors[:,M-1] # 1st principal axis +u0 = eigenvectors[:,M-1] # 1st principal axis 
-v2 = eigenvectors[:,M-2] # 2nd principal axis +u1 = eigenvectors[:,M-2] # 2nd principal axis 
-scatter(R_transpose.dot(v1),R_transpose.dot(v2))+scatter(R_transpose.dot(u0),R_transpose.dot(u1))
 show() show()
 </Code> </Code>
Line 60: Line 60:
 =====특이값 분해와의 관계===== =====특이값 분해와의 관계=====
 특이값 분해(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.$$
  
  
Line 65: Line 86:
 ======참고문헌====== ======참고문헌======
   * https://plot.ly/ipython-notebooks/principal-component-analysis/   * 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