Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| 전산물리학:주성분_분석 [2019/05/14 19:16] – [이론] admin | 전산물리학:주성분_분석 [2023/09/05 15:46] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| ======이론====== | ======이론====== | ||
| - | $N$번의 관찰로 얻어진 데이터가 있고, 각각의 데이터가 $M$개의 성분을 가진다고 하자. $n$ 번째 관찰은 $[R_{1n}, \ldots, R_{Mn}]^T$라는 열 벡터로 표현할 수 있고, 전체 데이터는 $M \times N$ 행렬 $R$로 쓸 수 있다. 여기에서 성분별 평균 $u_m = N^{-1} \sum_n R_{mn}$을 빼주어 새로운 행렬 $X$를 만들자: | + | $N$번의 관찰로 얻어진 데이터가 있고, 각각의 데이터가 $M$개의 성분을 가진다고 하자. $n$ 번째 관찰은 $[R_{1n}, \ldots, R_{Mn}]^T$라는 열 벡터로 표현할 수 있고, 전체 데이터는 $M \times N$ 행렬 $R$로 쓸 수 있다. 여기에서 성분별 평균 $\mu_m = N^{-1} \sum_n R_{mn}$을 빼주어 새로운 행렬 $X$를 만들자: |
| \begin{equation} | \begin{equation} | ||
| X = \begin{pmatrix} | X = \begin{pmatrix} | ||
| - | R_{11} - u_1 & \ldots & R_{1N}-u_1\\ | + | R_{11} - \mu_1 & \ldots & R_{1N} - \mu_1\\ |
| \vdots | \vdots | ||
| - | R_{M1}-u_M & \ldots & R_{MN}-u_M | + | R_{M1}-\mu_M & \ldots & R_{MN}-\mu_M |
| \end{pmatrix}. | \end{pmatrix}. | ||
| \end{equation} | \end{equation} | ||
| Line 30: | Line 30: | ||
| \begin{eqnarray} | \begin{eqnarray} | ||
| Q_{ij} &=& \frac{1}{N-1} \sum_{n=1}^N X_{in} X_{jn}\\ | Q_{ij} &=& \frac{1}{N-1} \sum_{n=1}^N X_{in} X_{jn}\\ | ||
| - | &=& \frac{1}{N-1} \sum_{n=1}^N (R_{in}-u_i) (R_{jn}-u_j). | + | &=& \frac{1}{N-1} \sum_{n=1}^N (R_{in}-\mu_i) (R_{jn}-\mu_j). |
| \end{eqnarray} | \end{eqnarray} | ||
| 위의 공분산 행렬을 대각화하였을 때 얻는 고유값 $\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차원으로 압축하는 것에 해당한다. | + | 다음처럼 예제 코드를 적을 수 있다. sklearn.datasets로부터 iris 데이터를 읽어들여서 이 중 $M(=3)$차원 |
| < | < | ||
| Line 46: | Line 46: | ||
| M, N = 3, 100 | M, N = 3, 100 | ||
| R_transpose = iris.data[: | R_transpose = iris.data[: | ||
| - | u = R_transpose.mean(axis=0) | + | mu = R_transpose.mean(axis=0) |
| - | X_transpose = R_transpose - u | + | X_transpose = R_transpose - mu |
| Q = X_transpose.T.dot(X_transpose)/ | Q = X_transpose.T.dot(X_transpose)/ | ||
| Line 61: | Line 61: | ||
| 특이값 분해(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 __future__ import print_function, | ||
| Line 71: | Line 71: | ||
| M, N = 3, 100 | M, N = 3, 100 | ||
| R_transpose = iris.data[: | R_transpose = iris.data[: | ||
| - | u = R_transpose.mean(axis=0) | + | mu = R_transpose.mean(axis=0) |
| - | X_transpose = R_transpose - u | + | X_transpose = R_transpose - mu |
| U, D, V_transpose = svd(X_transpose.T, | U, D, V_transpose = svd(X_transpose.T, | ||
| Line 82: | Line 82: | ||
| $$ X \hat{v}_i = \sigma_i \hat{u}_i \longleftrightarrow X^T \hat{u}_i = \sigma_i \hat{v}_i.$$ | $$ X \hat{v}_i = \sigma_i \hat{u}_i \longleftrightarrow X^T \hat{u}_i = \sigma_i \hat{v}_i.$$ | ||
| + | 정확히 같은 결과를 원할 경우 특이값을 곱하고 평균만큼 옮겨 주어서 다음처럼 적으면 될 것이다. | ||
| + | < | ||
| + | scatter(D[0]*V_transpose[0,: | ||
| + | </ | ||
| + | |||
| + | 실행 결과는 아래와 같다. | ||
| + | {{:: | ||
| ======참고문헌====== | ======참고문헌====== | ||