Differences
This shows you the differences between two versions of the page.
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$들이 있는데 이 고유 벡터들이 주축의 방향을 가리킨다. | ||
- | 각각의 관찰은 | + | 다음처럼 예제 코드를 적을 수 있다. sklearn.datasets로부터 iris 데이터를 읽어들여서 이 중 $M(=3)$차원 데이터 $N(=100)$개를 사용하자. 주성분 분석으로 얻어진 2개의 주축만을 취하고, 모든 데이터를 이 방향으로 사상시켜서 그린다. 이는 원래의 3차원 데이터를 2차원으로 압축하는 것에 해당한다. |
+ | |||
+ | < | ||
+ | from __future__ import print_function,division | ||
+ | from pylab import scatter, | ||
+ | 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[: | ||
+ | u = R_transpose.mean(axis=0) | ||
+ | X_transpose = R_transpose - u | ||
+ | |||
+ | Q = X_transpose.T.dot(X_transpose)/ | ||
+ | eigenvalues, | ||
+ | u0 = eigenvectors[:, | ||
+ | u1 = eigenvectors[:, | ||
+ | scatter(R_transpose.dot(u0), | ||
+ | show() | ||
+ | </ | ||
=====특이값 분해와의 관계===== | =====특이값 분해와의 관계===== | ||
특이값 분해(singular value decomposition)를 사용하면 $M \times N$ 행렬 $X$를 $X = U D V^T$로 분해할 수 있다. 이 때 $U$는 $M \times M$ 직교행렬, | 특이값 분해(singular value decomposition)를 사용하면 $M \times N$ 행렬 $X$를 $X = U D V^T$로 분해할 수 있다. 이 때 $U$는 $M \times M$ 직교행렬, | ||
+ | 특이값 분해를 사용하면 더 간결하게 적을 수 있다. | ||
+ | < | ||
+ | from __future__ import print_function, | ||
+ | from pylab import scatter, | ||
+ | from sklearn.datasets import load_iris | ||
+ | from numpy.linalg import svd | ||
+ | |||
+ | iris = load_iris() | ||
+ | M, N = 3, 100 | ||
+ | R_transpose = iris.data[: | ||
+ | u = R_transpose.mean(axis=0) | ||
+ | X_transpose = R_transpose - u | ||
+ | |||
+ | U, D, V_transpose = svd(X_transpose.T, | ||
+ | scatter(V_transpose[0,: | ||
+ | show() | ||
+ | </ | ||
+ | |||
+ | V_transpose의 행 벡터들(= V의 열 벡터들)을 바로 그려도 앞의 코드와 정성적으로 같은 결과를 얻는 까닭은, 특이값 분해에서 다음 관계가 성립하기 때문이다: | ||
+ | $$ X \hat{v}_i = \sigma_i \hat{u}_i \longleftrightarrow X^T \hat{u}_i = \sigma_i \hat{v}_i.$$ | ||
+ | ======참고문헌====== | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// |