본문으로 바로가기

주성분 분석 (PCA)

category AI/Machine Learning 2021. 1. 4. 11:37

PCA (Principal Component Analysis)

1) 개념

    - Unsupervised feature extraction의 방법 중 하나

    - 다수 데이터가 모인 분포의 주요 성분을 분석하는 것으로 데이터들의 분산이 가장 큰 방향벡터를 의미

왼쪽의 방향벡터가 분산을 최대로 하는 방향벡터임을 알 수 있음 (출처: https://www.youtube.com/channel/UCueLU1pCvFlM8Y8sth7a6RQ/videos)

    - 원본 데이터셋과 투영된 데이터셋 간의 평균제곱거리를 최소화하는 축

    - n 개의 관측치와 i 개의 변수로 구성된 데이터에서 상관관계가 없는 j 개의 변수로 구성된 데이터(n개의 관측치)

    - 기존 변수의 선형결합으로 구성됨

    

2) 활용도

    - 영상인식

    - 데이터 압축 (차원 감소)

    - 노이즈 제거 등

 

3) 방법

    - 모든 변수 x 에 대해 임의의 기저 (basis) 또는 계수 (x 개수)로 선형결합 -> 각 기저로 사영 변환 후의 변수

    - 정사영 (projection)을 통해 n차원 공간상의 데이터를 k (k < n)차원의 데이터셋으로 변환

    - 매니폴드 (manifold)실제 데이터셋이 차원이 낮은 매니폴드에 가깝게 놓여있다고 가정하고 문제를 해결

 

4) 과정

    (1) 데이터 표준화 (Standardization)

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)

    (2) 기존 변수의 covariance (correlation) matrix 계산

cov_mat = np.cov(X_train_std.T)

    (3) (2)으로부터 고유값, 고유벡터 계산

# 공분산 행렬의 n x n 차원의 수 만큼 고유값이 나온다
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)

    (4) 고유값을 내림차순으로 정렬하고 고유벡터의 순위를 매김

# tuple list (eigen value, eigen vector)
eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:, i])
               for i in range(len(eigen_vals))]

# 높은 값에서 낮은 값으로 (고유값, 고유벡터) 튜플 정렬
eigen_pairs.sort(key = lambda k: k[0], reverse = True)

        - 가장 큰 고유값을 가지고 있는 고유벡터가 데이터를 가장 잘 설명한다.

        - 고유값을 기준으로 고유벡터를 선택하면 되는데 선택한 개수가 PCA 이후의 차원의 개수이다.

    (5) 정렬된 고유벡터로 기존 변수 변환 (선형 결합)

# 분산이 큰 상위 2개만 선택
w = np.hstack((eigen_pairs[0][1][:, np.newaxis],
               eigen_pairs[1][1][:, np.newaxis]))
print(f"투영 행렬 : {w}")

# 기존벡터와 선형결합
X_train_pca = X_train_std.dot(w)

 

5) 주성분 개수 선택

    - 모든 주성분을 다 사용하기에는 주성분 분석을 하는 의미 퇴색

    - 고유값 감소율이 유의미하게 낮아지는 주성분 선택

    - 일정 수준 이상의 분산비를 보존하는 최소의 주성분 선택 (가장 대표적인 주성분 선택)

 

6) 한계

    - 다중 가우시안 (비정규분포)인 자료들에 적용이 어려움

    - 비지도학습이기 때문에 모든 분류 및 예측 문제가 정확하지 않음

 

코드 예시

from sklearn.decomposition import PCA

pca = PCA(n_components = 2)
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)

# 전체 주성분에 대한 분산의 크기
pca = PCA(n_components = None)
X_train_pca = pca.fit_transform(X_train_std)
pca.explained_variance_ratio_ # 내림차순으로 나타남

공분산

1) 개요

    - 표준편차 또는 분산과 달리 2차원 (2 개의 변수) 간의 분포를 파악하기 위해 사용한다.

$$cov_{x,y}=\frac{\sum_{i=1}^{N}(x_{i}-\bar{x})(y_{i}-\bar{y})}{N-1}$$

    - x편차, y편차의 곱의 평균

 

2) 의미

    - 공분산 값이 양수 : 양의 상관관계 (두 변수는 동시에 증가한다.)

    - 공분산 값이 음수 : 음의 상관관계 (하나의 변수가 증가하면 나머지 하나는 감소한다.)

    - 공분산이 0 일 때 : 독립 관계 (두 변수는 서로 간에 영향을 끼치지 않는다.)

 

공분산 행렬

1) 개요

    - 3차원 이상의 데이터의 공분산을 다루고자 할 때, 가능한 모든 변수들의 공분산을 구하고 행렬로 표현한 것이다.

    - 공분산 행렬의 고유벡터는 데이터가 어느 방향으로 분산되어 있는지 나타냄

    - i, j번 좌표의 데이터 공분산 값을 행렬 i행 j열 원소값으로 하는 행렬 (대각 성분 = 각 변수의 분산, 비대각 성분 = 대응하는 두 변수의 공분산)


참고

angeloyeo.github.io/

darkpgmr.tistory.com/

머신러닝 교과서 (길벗)

www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf

'AI > Machine Learning' 카테고리의 다른 글

Random Forest  (0) 2021.02.19
Support Vector Machine; SVM  (0) 2021.02.18
Overfitting (과적합)  (0) 2021.02.17
Decision Tree  (0) 2021.01.21
k-NN (Nearest Neighbors)  (0) 2021.01.18