Principal Component Analysis (PCA)

이정훈·2025년 12월 27일

1.주성분 분석(PCA)

  • unsupervised learning
  • 고차원의 데이터를 저차원으로 축소하는 기법
  • 데이터의 분산(Variance)을 최대한 보존하면서 새로운 축(주성분)을 찾아 데이터를 투영하는 알고리즘
  • 분산을 최대한 보존 = projection error를 최소화
  • 머신러닝에서 차원의 저주(Curse of Dimensionality)를 해결하거나, 데이터 시각화 및 노이즈 제거 용도로 사용

2.Fomulation for PCA

PCA의 핵심은 "데이터가 가장 넓게 퍼져 있는 방향(분산이 가장 큰 방향)이 가장 중요한 정보를 담고 있다"는 가정에서 출발

step1. Mean Centering

  • 절대적인 위치 정보를 제거하고, 변화의 패턴(분산)'에만 집중
  • 분산이라는 개념이 기준점(평균)이 필요 → 평균

step2. Formulate the optimization problem

  • 아래를 만족하는 단위 벡터 w\mathbf{w} (w=1||\mathbf{w}||=1)를 찾고자함. (내적||A||cos||B||할떄 ||B||를 1로 설정하기 위함)

    w\mathbf{w} 벡터 위로 데이터를 projection시켰을 떄, 그 퍼짐(분산)이 최대화

  • 투영한 데이터 길이(xiTw\mathbf{x}_i^T \mathbf{w})에 대한 분산을 계산

σ2=1ni=1n(xiTw)2\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (\mathbf{x}_i^T \mathbf{w})^2
  • 이 식을 행렬 형태로 변환 및 최종목표
    σ2=1n(Xw)T(Xw)=wT(1nXTX)w\sigma^2 = \frac{1}{n} (\mathbf{X}\mathbf{w})^T (\mathbf{X}\mathbf{w}) = \mathbf{w}^T \left( \frac{1}{n} \mathbf{X}^T \mathbf{X} \right) \mathbf{w}
Maximize wTCwsubject to w2=wTw=1\text{Maximize } \mathbf{w}^T \mathbf{C} \mathbf{w} \quad \text{subject to } ||\mathbf{w}||^2 = \mathbf{w}^T \mathbf{w} = 1

step3. Obtain solution with Lagrange Multipliers

  • 제약 조건이 있는 최적화 문제를 풀기 위해 아래와 같은 라그랑즈 함수 LL을 정의 및 미분
L(w,λ)=wTCwλ(wTw1)L(\mathbf{w}, \lambda) = \mathbf{w}^T \mathbf{C} \mathbf{w} - \lambda (\mathbf{w}^T \mathbf{w} - 1)
Lw=2Cw2λw=0\frac{\partial L}{\partial \mathbf{w}} = 2\mathbf{C}\mathbf{w} - 2\lambda\mathbf{w} = 0
Cw=λw\mathbf{C}\mathbf{w} = \lambda \mathbf{w}

step3. Result (Eigenvalue Problem)

  • step3에서 얻은 최종 식은 CC(공분산 행렬)에 대한 Eigenvalue, Eigenvector 정의 그 자체
  • 분산(wTCw\mathbf{w}^T \mathbf{C} \mathbf{w})을 최대화하고 싶었음으로 식에 대입하면 가장 큰 고유값(λmax\lambda_{max})에 해당하는 고유벡터(w\mathbf{w})가 제 1 주성분(PC1)이 된다"는 것이 수학적으로 증명
wT(Cw)=wT(λw)=λ(wTw)=λ\mathbf{w}^T (\mathbf{C} \mathbf{w}) = \mathbf{w}^T (\lambda \mathbf{w}) = \lambda (\mathbf{w}^T \mathbf{w}) = \lambda

3.직관적인 이해

Compression / Projection

  • 10차원을 가지는 데이터들을 아래와 같이 2차원으로 압축
    zi1=diTq1z_{i1} = d_i^T q_1 , zi2=diTq2z_{i2} = d_i^T q_2
  • diTq1d_i^T q_1은 데이터 did_i를 고유벡터 q1q_1 방향으로 투영했을 때의 좌표값(Score)
  • 각 데이터마다 2개의 숫자(zi1,zi2z_{i1}, z_{i2})만 남게 되므로 N×2N \times 2 행렬이 됨

Reconstruction

  • 압축된 좌표값에 다시 고유벡터를 곱해 원래 공간으로 돌려보내는 과정
    d^i=(diTq1)q1T+(diTq2)q2T\hat{d}_i = (d_i^T q_1) q_1^T + (d_i^T q_2) q_2^T
  • qiTq_i^T 은 벡터 (1^10), 10차원으로 span하는 고유벡터 위의 한 점으로 나타냄
  • 10차원 벡터들을 더한 것이므로, 최종 재구성된 데이터 d^i\hat{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

# 1. 데이터 로드
iris = load_iris()
X = iris.data
target = iris.target

# 2. 데이터 전처리 (표준화)
# PCA는 스케일에 민감하므로 반드시 표준화를 거쳐야 합니다.
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3. PCA 수행 (4차원 -> 2차원으로 축소)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 4. 결과 확인
print(f"기존 차원: {X_scaled.shape}") # (150, 4)
print(f"축소된 차원: {X_pca.shape}")   # (150, 2)
print(f"설명된 분산 비율: {pca.explained_variance_ratio_}")
# 출력 예: [0.7296 0.2285] -> PC1이 약 73%, PC2가 약 23%의 정보를 가짐

# 각 변수의 의미
print("1. Eigenvectors (고유벡터):\n", pca.components_)
print("\n2. Eigenvalues (고유값):\n", pca.explained_variance_)
print("\n3. 분산 설명 비율 (%):\n", pca.explained_variance_ratio_)
profile
AngDDo

0개의 댓글