1.주성분 분석(PCA)
- unsupervised learning
- 고차원의 데이터를 저차원으로 축소하는 기법
- 데이터의 분산(Variance)을 최대한 보존하면서 새로운 축(주성분)을 찾아 데이터를 투영하는 알고리즘
- 분산을 최대한 보존 = projection error를 최소화
- 머신러닝에서 차원의 저주(Curse of Dimensionality)를 해결하거나, 데이터 시각화 및 노이즈 제거 용도로 사용
2.Fomulation for PCA
PCA의 핵심은 "데이터가 가장 넓게 퍼져 있는 방향(분산이 가장 큰 방향)이 가장 중요한 정보를 담고 있다"는 가정에서 출발
step1. Mean Centering
- 절대적인 위치 정보를 제거하고, 변화의 패턴(분산)'에만 집중
- 분산이라는 개념이 기준점(평균)이 필요 → 평균
σ2=n1i=1∑n(xiTw)2
- 이 식을 행렬 형태로 변환 및 최종목표
σ2=n1(Xw)T(Xw)=wT(n1XTX)w
Maximize wTCwsubject to ∣∣w∣∣2=wTw=1
step3. Obtain solution with Lagrange Multipliers
- 제약 조건이 있는 최적화 문제를 풀기 위해 아래와 같은 라그랑즈 함수 L을 정의 및 미분
L(w,λ)=wTCw−λ(wTw−1)
∂w∂L=2Cw−2λw=0
Cw=λw
step3. Result (Eigenvalue Problem)
- step3에서 얻은 최종 식은 C(공분산 행렬)에 대한 Eigenvalue, Eigenvector 정의 그 자체
- 분산(wTCw)을 최대화하고 싶었음으로 식에 대입하면 가장 큰 고유값(λmax)에 해당하는 고유벡터(w)가 제 1 주성분(PC1)이 된다"는 것이 수학적으로 증명
wT(Cw)=wT(λw)=λ(wTw)=λ
3.직관적인 이해
Compression / Projection
- 10차원을 가지는 데이터들을 아래와 같이 2차원으로 압축
zi1=diTq1 , zi2=diTq2
- diTq1은 데이터 di를 고유벡터 q1 방향으로 투영했을 때의 좌표값(Score)
- 각 데이터마다 2개의 숫자(zi1,zi2)만 남게 되므로 N×2 행렬이 됨
Reconstruction
- 압축된 좌표값에 다시 고유벡터를 곱해 원래 공간으로 돌려보내는 과정
d^i=(diTq1)q1T+(diTq2)q2T
- qiT 은 벡터 (1^10), 10차원으로 span하는 고유벡터 위의 한 점으로 나타냄
- 10차원 벡터들을 더한 것이므로, 최종 재구성된 데이터 d^i는 원래와 같은 10차
- mean centering을 해주었기 떄문에 다시 평균을 더함
Python 구현
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
target = iris.target
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(f"기존 차원: {X_scaled.shape}")
print(f"축소된 차원: {X_pca.shape}")
print(f"설명된 분산 비율: {pca.explained_variance_ratio_}")
print("1. Eigenvectors (고유벡터):\n", pca.components_)
print("\n2. Eigenvalues (고유값):\n", pca.explained_variance_)
print("\n3. 분산 설명 비율 (%):\n", pca.explained_variance_ratio_)