주성분분석(PCA) 이해용 파이썬 코드¶
- 주성분분석은 고차원 데이터를 저차원으로 투영하되, 최대한 정보를 가지고 있게끔 하는 방법입니다.
In [2]:
import numpy as np
import numpy.linalg as linalg
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
In [7]:
iris = datasets.load_iris()
iris_data = iris['data']
0으로 평균화 한다.¶
- PCA는 각 feature들이 들쭉날쭉할경우 제대로 되지 않습니다.
In [25]:
iris_std = StandardScaler().fit_transform(iris_data)
공분산 계산¶
- 오리지널 공분산의 경우 자신의 분산을 제외하고도 다른 값들도 0이 아닌 값들을 보여준다.
- 즉, feature마다 그 힘이 섞여져 있기 때문에 이를 하나하나 독립적인 예측력을 지니도록 투영하는 작업이라고 생각하면 된다.
- 대각행렬은 분산이며, 그 외의 행렬은 공분산이다. feature-feature간 상관관계를 보여준다.
- 모든 feature가 독립적이라면, 이는 0에 가까운값이여야 한다.
In [26]:
iris_cov = (np.cov(iris_std.T))
iris_cov
Out[26]:
공분산으로부터 고유벡터, 고유값을 뽑아낸다.¶
- 공분산행렬에서 고유값과 고유벡터를 계산할 수 있다.
- 특성다항식을 이용해 계산하면 되는데, 직관적 이해는 공분산행렬을 선형변환을 통해서 서로 독립인 데이터를 만들수 있다는것이다.
- 그리고 고유벡터는 각각의 벡터가 직교하기 때문에 무엇이든 투영할수 있다.
- 고유값의 크기별로 내림차순으로 되어있기 때문에, 영향력을 말한다고 할수도 있다.
- 따라서 PC1부터 차례대로 기존의 행렬의 내적을 한다면, 축소된 차원이지만 정보는 차있는 알찬 결과를 얻게 된다.
In [27]:
eig_vals, eig_vecs = np.linalg.eig(iris_cov)
In [16]:
eig_vals_sum = np.sum(eig_vals)
for eig_val in eig_vals:
print ("contain " + str(eig_val/eig_vals_sum))
- 제1주성분을 도출해서 이를 이용해 데이터를 예측하면 정보손실은 최소화하면서 예측력은 높일수있다.
In [24]:
PC1 = iris_std.dot(np.reshape(eig_vecs.T[0], (4, 1)))
PC1
Out[24]: