PCA in python
<엔지니어는 구현을 못하면 모르는것이다>
PCA(principal component analysis) 주성분 분석
PCA 이해 개념적으로 간단히
데이터의 차원을 줄이려고 하는데 원데이터의 성질을 가장 잘 보존하고자한다.
이때 분산은 데이터들의 분포 특성을 가장 잘설명하며 이 분산의 방향이 가장 큰 방향벡터를 주성분이라고 함
그리고 데이터를 가장 큰 방향벡터를 기준으로 투영(Projection)하여 변형(feature extraction) 하는것이 PCA이다.
따라서 PCA 후에는 데이터 값이 달라지지만 기존 데이터의 분포 특성을 최대한 보존한다.
첫번째 축을 찾은뒤 첫번째 축과 직교(orthogonal)하면서 분산이 가장 큰, 즉 가장 큰 방향벡터(주성분)를 찾은 뒤 축으로 하여 데이터를 투영하며
이런 반복을 원하는 차원의 수만큼 반복한다.
그런 뒤 투영된 값들을 새로운 feature로 변환시켜 사용한다.
PCA 이해 수학적으로 간단히
공분산 행렬은 데이터가 얼마나 함께 변화하는지를 나타낸다.
공분산 행렬을 이용(Eigenvalue Decomposition)하면 고유 벡터(Eigenvector)와 고유값(Eigenvalue) 라는 것을 구할수 있다.
Eigenvector 는 선형 변환을 하여도 방향이 보존되며 크기만 변하는 벡터이고, Eigenvalue 는 Eigenvector의 변하는 크기를 나타내며 이 고유값이 클수록 데이터의 경향성을 강하게 나타내고 있기떄문에 높을수록 좋다.
그리고 구한 고유 벡터는 최대 분산의 방향에 해당한다.
이 고유 벡터에 직교하는 그 다음 분산을 가장 잘 설명하는(고유값이 큰) eigenvector를 구하는 작업을 원하는 차원의 개수만큼 반복한다.
그런 뒤 구한 고유벡터로 투영된 값들을 새로운 feature로 변환시켜 사용한다.
참고로 보통 Eigenvalue의 분산 설명력의 비율이 90% 넘을때까지 벡터(차원의 수)들을 선택한다.
import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
# n_components: 투영할 축 개수, / svd_solver: 알고리즘
pca = PCA(n_components=2, random_state=1234, svd_solver='auto')
x_trans = pca.fit_transform(X)
# 전체 분산 총량중 첫번째 주성분의 분산설명력의 비율
print(pca.explained_variance_ratio_[0])
# 위와 같이 설명 비율을 아래와 같은식
pca_explained_variance_ratio_2 = pca.explained_variance_/sum(pca.explained_variance_)
print(pca_explained_variance_ratio_2)
# 누적 설명력
print(pca.explained_variance_ratio_.cumsum())
# 90% 이상 누적 설명력을 가지는 차원의 최소 개수
print(np.argmax(pca.explained_variance_ratio_.cumsum() >= 0.9) + 1)
# 고유값 = Eigenvalue : 설명 정도
# 두번째 주성분의 고유값
print(pca.explained_variance_ratio_[1])
# 고유벡터 = Eignevector : 축에 투영시 반영되는 방향 벡터값
print(pca.components_)
# 첫번째 주성분에 대한 2번째 변수의 사영계수값
print(pca.components_[0,1])
# 고유값과 고유 벡터로 투영되어 변환된 값
x_trans