PCA 기반 얼굴 인식(Eigenfaces) & (Kernel) PCA 기반 이미지 디노이징

Kim Myeong Hyun·2025년 12월 8일

Machine Learning

목록 보기
1/1

목차

  1. A. Eigenfaces (PCA) + SVM 얼굴 인식
    1. 코드 블록별 해설
    2. (A-Q1~Q6) 질문 답변
    3. 파라미터 변경 시 결과/수학적 의미
    4. 재밌게 이론 검증해보기
  2. B. (Kernel) PCA로 이미지 디노이징
    1. 코드 블록별 해설
    2. (B-Q1~Q7) 질문 답변
    3. 재밌게 파라미터 변화 실험
  3. 결론

A. Eigenfaces (PCA) + SVM 얼굴 인식

A-0. 문제 설정 한 줄 요약

얼굴 이미지는 픽셀을 일렬로 펼치면 차원이 매우 커집니다(수천~수만 차원).
PCA로 “얼굴들이 주로 변하는 방향(주성분)”만 남겨 저차원 표현(=eigenface 계수)을 만들고, 그 공간에서 SVM으로 사람을 분류합니다.


A-1. 코드 블록별 해설 (scikit-learn 예제 기준)

(1) 라이브러리 임포트

  • fetch_lfw_people: LFW 얼굴 데이터 로더
  • PCA: 주성분 분석
  • SVC: RBF SVM 분류기
  • StandardScaler: 스케일/표준화
  • RandomizedSearchCV, loguniform: (C, γ) 하이퍼파라미터 탐색
  • classification_report, ConfusionMatrixDisplay: 정량 평가/시각화

이렇게 나누는 이유

  • 비지도 학습(PCA)로 특징을 뽑고 → 지도 학습(SVM)으로 분류하는 “unsupervised + supervised chaining” 구조입니다.

(2) 데이터 로드: fetch_lfw_people(min_faces_per_person=70, resize=0.4)

핵심 파라미터:

  • min_faces_per_person=70
    한 사람(클래스)당 최소 70장 이상 있는 사람만 남깁니다.

    • 왜 70? 너무 적은 샘플을 포함하면 클래스별 분산 추정이 불안정하고, train/test로 나눴을 때 어떤 사람은 학습 샘플이 너무 적어집니다.
    • 값을 낮추면: 더 많은 사람(클래스)이 포함되지만, 각 클래스 샘플 수가 줄어 과적합/불균형 위험이 커집니다.
    • 값을 올리면: 클래스 수가 줄고 데이터가 “유명 인물 소수”에 집중되며, 분류가 쉬워질 수도 있지만 문제 자체가 단순해질 수 있습니다.
  • resize=0.4
    이미지를 원본 대비 0.4배로 줄여 특징 수(n_features)를 크게 줄입니다.

    • 왜 0.4? 얼굴 픽셀을 그대로 쓰는 모델(SVM)은 차원이 커질수록 학습/탐색이 비싸집니다. 해상도를 줄이면 차원이 줄어 속도가 좋아집니다.
    • 너무 작게 줄이면(예: 0.1): 얼굴의 구분 정보(눈/코 윤곽)가 뭉개져 성능이 떨어질 수 있습니다.
    • 너무 크게(예: 1.0): 정확도는 오를 수 있으나 연산량/메모리가 급증합니다.

데이터는 다음처럼 다룹니다.

  • lfw_people.images는 (n_samples, h, w) 형태의 이미지 텐서
  • lfw_people.data는 (n_samples, n_features) 형태의 flatten된 벡터
    → 이 예제는 “픽셀 위치의 2D 구조(인접성)”를 모델이 직접 쓰지 않습니다. (CNN이 아닌, 전통적 ML 설정)

예제 출력(원문)

Total dataset size:
n_samples: 1288
n_features: 1850
n_classes: 7

→ 즉, 0.4 리사이즈 후에도 한 장이 1850차원(픽셀)로 꽤 큽니다.


(3) 학습/평가 분리: train_test_split(test_size=0.25, random_state=42)

  • test_size=0.25: 데이터의 25%를 테스트로 사용
    • 테스트를 너무 작게 잡으면: 평가 분산이 큼
    • 너무 크게 잡으면: 학습 데이터가 부족해짐
      25%는 간단 예제에서 흔한 절충입니다.
  • random_state=42: 재현성(같은 분할 유지)

예제에서는 1288장의 25%인 약 322장을 테스트로 쓰고, 나머지 966장으로 학습합니다.


(4) 표준화: StandardScaler()

픽셀(feature)마다 분산이 다를 수 있고, 조명/명암으로 전체 값 범위가 흔들릴 수 있습니다.

  • StandardScaler는 각 feature에 대해

    x=xμσx' = \frac{x - \mu}{\sigma}

    로 변환합니다.

  • Why Need

    • PCA는 기본적으로 입력을 center(평균 제거) 하지만, feature별 스케일을 맞춰주진 않습니다.
    • SVM(RBF)은 거리 (xx)( |x-x'| )에 민감하므로, 스케일 불균형이 있으면 특정 픽셀이 과도하게 영향을 미칩니다.

제가 실제로 경험해본 ML에서는 StandardScalerwhiten=True는 “둘 다 스케일링”이지만 대상이 다릅니다.

  • StandardScaler: 픽셀(feature) 단위로 분산을 1로
  • whitening: 주성분(component) 단위로 분산을 1로
    둘을 동시에 쓰면 “픽셀 스케일 불균형”과 “주성분 스케일 불균형”을 모두 줄인다는 의도가 됩니다.

(5) PCA 학습: PCA(n_components=150, svd_solver="randomized", whiten=True)

핵심 파라미터 3개를 분해해서 이해하면 됩니다.

5-1) n_components=150의 의미

  • PCA는 공분산 Σ\Sigma 의 고유값/고유벡터를 구해, 분산이 큰 순서대로 축을 정렬합니다.

  • 상위 150개 성분만 남기면,

    xμ+i=1150zivix \approx \mu + \sum_{i=1}^{150} z_i v_i

    로 근사합니다.

  • 왜 150?

    • 너무 적으면: 얼굴 구분에 필요한 변동(표정/조명/개인차)까지 잘라 성능 하락
    • 너무 많으면: 계산 비용 증가 + 노이즈 성분까지 포함이 가능해집니당
      예제는 “속도-성능” 으로 해당 트레이드 오프를 고려해서인지 150을 택합니다. 세부적인 실험은 수행해보지 않았습니다

예제 출력:

Extracting the top 150 eigenfaces from 966 faces
done in 0.087s
Projecting the input data on the eigenfaces orthonormal basis
done in 0.006s

5-2) svd_solver="randomized"의 의미

  • 큰 행렬에서 SVD를 정확히 하면 비용이 큽니다.
  • randomized는 “상위 일부 성분만” 필요할 때 근사적으로 빠르게 구하는 알고리즘 계열입니다.
    직관: 전체 SVD 대신 “필요한 랭크 근처만” 랜덤 프로젝션으로 추정합니다.

5-3) whiten=True의 의미(수학/직관)

PCA 변환 결과 zz는 성분 간 상관은 0이지만(대각 공분산), 각 성분의 분산은 λi\lambda_i 로 다릅니다.

  • Whitening은

    ziwhite=ziλiz_i^{\text{white}} = \frac{z_i}{\sqrt{\lambda_i}}

    로 스케일링하여 모든 성분의 분산을 1로 맞춥니다.

  • 장점: RBF SVM처럼 거리 기반 모델에서 “특정 주성분(큰 분산)”이 거리를 지배하는 현상을 줄여 등방성(isotropic)에 가깝게 만듭니다.

  • 단점: 상대적 분산 정보(“어느 방향이 더 중요했는지”)를 일부 버리고, 작은 λi\lambda_i 방향을 과증폭하여 노이즈를 키울 수도 있습니다.


(6) Eigenface 생성: pca.components_.reshape((n_components, h, w))

  • pca.components_는 각 주성분 벡터 viv_i (길이 n_features)를 담습니다.
  • 이를 (h, w)로 reshape하면 “고유얼굴(eigenface)” 이미지가 됩니다.
  • 의미: 데이터셋 전체에서 자주 등장하는 “밝기/그림자/윤곽 변화 패턴”이 시각화됩니다.

(7) SVM 학습 + 하이퍼파라미터 탐색

핵심은 이 부분입니다.

  • 모델: SVC(kernel="rbf", class_weight="balanced")

    • rbf

      k(x,x)=exp(γxx2)k(x, x') = \exp(-\gamma \|x-x'\|^2)

      형태의 커널을 씁니다.

    • class_weight="balanced"는 클래스별 샘플 수 차이를 보정해, 적은 클래스가 무시되지 않게 합니다.

  • 탐색: RandomizedSearchCV(..., n_iter=10)

    • C ~ loguniform(1e3, 1e5)
      C는 오분류 패널티(정규화 강도 역수). 보통 로그 스케일로 효과가 바뀌므로 log-uniform이 합리적입니다.
    • gamma ~ loguniform(1e-4, 1e-1)
      γ는 RBF의 “폭”을 결정합니다. γ가 크면 결정경계가 더 국소적(복잡), 작으면 더 전역적(부드러움).
    • n_iter=10은 “예제 수준에서 시간 제한”을 고려한 단순한 예제를 보여주기 위함인 것 같습니다.
      GridSearch로 촘촘히 돌리면 비용이 폭증하므로, 넓은 범위는 랜덤 탐색이 유리합니다.

예제 출력:

Fitting the classifier to the training set
done in 6.049s
Best estimator found by grid search:
SVC(C=..., class_weight='balanced', gamma=...)

(8) 평가: classification report + confusion matrix + 갤러리

  • classification_report: precision/recall/F1 등 지표
  • ConfusionMatrixDisplay.from_estimator(..., display_labels=..., xticks_rotation="vertical")
    • 라벨을 사람 이름으로 표시
    • 세로 회전은 긴 이름이 겹치는 것을 방지

예제에서는 전체 정확도 약 0.84로 보입니다(테스트 322장 기준).
또한 Bush/Blair/Powell 등 인물이 상대적으로 잘 맞고, Chavez 같은 상대적으로 샘플이 적거나 변동이 큰 인물은 recall이 낮게 나올 수 있습니다.

  • plot_gallery(images, titles, h, w, n_row=3, n_col=4)
    • figsize=(1.8*n_col, 2.4*n_row)는 12장(3×4)을 보기 좋게 배치하는 휴리스틱
    • subplots_adjust로 여백/간격 조정
  • title(...) 함수는 예측/정답 이름의 마지막 성(surname)만 뽑아 표시합니다(rsplit(" ", 1)).

A-2. (Q1~Q6) 질문 답변

Q1) Why PCA? 왜 얼굴 인식에서 PCA를 사용하는가?

1) 차원 축소(속도/메모리)
픽셀을 펼친 특징은 매우 고차원입니다. RBF SVM 같은 모델은 입력 차원이 크면 학습이 느려지고 과적합 위험이 커집니다.

2) 노이즈/중복 제거(통계적 효율)
얼굴 이미지는 픽셀 간 상관이 큽니다(인접 픽셀 밝기 비슷). PCA는 상관 구조를 요약해 중복 정보를 압축합니다.

3) 샘플 수 < 차원(“small n, large p”) 문제 완화
얼굴 데이터는 보통 “사람 수/이미지 수”가 픽셀 차원보다 작기 쉬워 공분산 추정이 불안정합니다. PCA는 효과적인 저차원 표현을 제공합니다.


Q2) What exactly is an eigenface?

  • 평균 얼굴 μ\mu 를 뺀 얼굴 벡터들의 공분산 Σ\Sigma 에 대해
    Σvi=λivi\Sigma v_i = \lambda_i v_i

    를 만족하는 고유벡터 viv_i를 이미지 모양으로 reshape한 것이 eigenface입니다.

  • 직관: “데이터셋 전체에서 가장 자주 나타나는 변화 방향”을 얼굴 이미지 형태로 보여줌.

    • 1번 eigenface: 조명 방향/전체 밝기 변화
    • 다음 eigenface: 얼굴 윤곽/눈썹/안경 등 변동 패턴

Q3) 왜 whitening을 적용하는가?

  • PCA 좌표 zz는 성분 간 상관은 없지만, 분산이 λi\lambda_i로 달라서 1~몇 개 주성분이 거리를 지배할 수 있습니다.
  • Whitening은 분산을 1로 맞춰:
    • (특히 RBF처럼 거리 기반) 각 성분이 비슷한 스케일로 기여
    • SVM 하이퍼파라미터(γ)가 특정 축 스케일에 덜 민감
  • 단, 작은 고유값 성분을 과도하게 키워 노이즈를 증폭할 수 있어서 항상 유리하진 않습니다.

Q4) PCA가 버리는 정보는 무엇인가?

PCA가 버리는 것은 “작은 분산 방향”입니다. 구체적으로는:
1) 미세한 디테일/고주파 성분
고유값이 작은 성분은 데이터셋에서 덜 흔한 변화인데, 종종 미세한 구분 정보(점, 주름, 작은 윤곽)를 포함할 수 있습니다.
2) 분류에 유용하지만 분산이 작은 방향
PCA는 분산 최대화가 목적이지, 클래스 분리 최대화가 목적이 아닙니다.
→ “분류에는 중요하지만 전체 분산은 작다”면 잘릴 수 있습니다.
3) (예제의 전처리 자체가) 공간적 위치 관계
이미지를 벡터로 펼치므로 “눈-코-입의 상대 위치”라는 2D 구조적 제약은 모델이 직접 사용하지 못합니다.


Q5) Why use SVM after PCA instead of SVM directly?

  • 연산량 감소:
    RBF SVM은 거리 계산/커널 행렬 계산이 비싸고, 차원이 커지면 적절한 γ 탐색도 어려워집니다.
  • 일반화 개선:
    고차원 픽셀은 노이즈와 상관구조가 커서 SVM이 불필요한 방향까지 맞추기 쉬운데, PCA가 이를 “정규화(denoise + compress)”합니다.
  • 하이퍼파라미터 탐색 안정화:
    차원이 큰 원공간에서 γ의 적정 범위는 매우 민감합니다. PCA(+whiten)는 스케일을 정리해 탐색을 좀 더 안정화할 수 있습니다.

Q6) What is the geometry of SVM in PCA space?

PCA를 거친 좌표를 zRkz \in \mathbb{R}^k 라고 하면:

  • 선형 SVM이면:
    f(z)=wTz+bf(z) = w^T z + b

    로 표현되고, 결정경계는 PCA 공간에서 “평면(초평면)”입니다.
    마진은 2/w2/\|w\| 로, PCA 공간에서의 유클리드 거리 기준 최대 마진을 찾습니다.

  • RBF SVM이면:
    결정함수는

    f(z)=iαiyiexp(γzzi2)+bf(z) = \sum_i \alpha_i y_i \exp(-\gamma \|z - z_i\|^2) + b

    형태로, PCA 공간에서 지원 벡터 주변에 방사형으로 영향이 퍼지는 비선형 경계가 만들어집니다.

  • Whitening이 켜져 있으면
    zz2\|z-z'\|^2 가 사실상 원공간에서의 마할라노비스 거리와 유사한 의미를 갖습니다(각 주성분 분산을 1로 맞췄기 때문).
    즉, “큰 분산 축만 과대평가하지 않는 거리”로 RBF가 작동합니다.


A-3. 파라미터 변경 시 결과/수학적 의미

(i) n_components를 바꾸면?

  • k를 줄이면: x^=μ+i=1kzivi\hat x = \mu + \sum_{i=1}^k z_i v_i 근사에서 더 많은 성분이 누락 → 재구성 오차 증가

    • 대개 속도↑, 과적합↓, 성능은 어느 지점까지 유지
    • 너무 줄이면 정보 부족(underfit)
  • k를 늘리면: 근사 오차 감소, 하지만 노이즈/희귀 변동까지 포함 가능

    • 속도↓, 때로는 과적합↑

(ii) resize를 바꾸면?

해상도는 곧 n_features입니다.

  • resize↑ → 특징수↑ → SVM 학습·탐색 비용 급증
  • resize↓ → 특징수↓ → 정보 손실 가능

(iii) whiten을 끄면?

  • 장점: 상대적 분산(“큰 변동 축”)을 그대로 유지 → 어떤 데이터에서는 그게 분류에 도움
  • 단점: RBF 거리에서 큰 분산 축이 지나치게 우세 → γ 튜닝 민감

A-4. 재밌게 이론 검증해보기

해당 코드에서 가져가는 구조는 표준화, PCA, SVM을 load_digits 으로 실행하고 있습니다.

그래서, 동일한 구조(표준화→PCA→SVM)load_digits로 실행해 “전처리 차이가 결과에 어떤 영향을 주는지”를 확인했습니다.

실행 결과(내장 digits, 작은 랜덤 탐색)

  • 설정: train 500 / test 200, RandomizedSearchCV(n_iter=20, cv=2)
  • 결과(정확도):
    • SVM 직접(픽셀): 0.965
    • PCA(32) + SVM (whiten=False): 0.985
    • PCA(32) + SVM (whiten=True): 0.960

열심히 해석해 본 결과:

  • PCA 이후 성능이 좋아질 수 있는 이유(차원축소·노이즈 억제)가 실제로 관찰됨.
  • Whitening은 “항상” 이득이 아니라, 데이터/γ 범위/노이즈 구조에 따라 손해일 수도 있음을 보여줌. (얼굴 예제에서는 whitening이 종종 도움이 되도록 세팅됨)

B. (Kernel) PCA로 이미지 디노이징

B-0. 문제 설정 한 줄 요약

노이즈가 섞인 이미지 xnoisy=x+ϵx_{noisy} = x + \epsilon
PCA 또는 KernelPCA로 저차원 표현으로 투영한 뒤 다시 복원하여 ϵ\epsilon 성분을 줄입니다.


B-1. 코드 블록별 해설 (scikit-learn 예제 기준)

(1) 데이터 로드: fetch_openml(data_id=41082) + MinMaxScaler()

  • USPS digits를 OpenML에서 불러오고
  • 픽셀 값을 (0, 1)로 정규화합니다.

왜 MinMaxScaler로 [0,1]?

  • 노이즈 표준편차 scale=0.25 같은 값은 입력 스케일에 민감합니다.
    픽셀이 [0,1]이면 “0.25짜리 가우시안 노이즈”가 어느 정도 센지 직관적입니다.
  • 커널 PCA의 gamma도 거리 스케일에 매우 민감하므로, 스케일을 고정하는 것이 중요합니다.

(2) train/test split + 노이즈 추가

  • train_size=1000, test_size=100, stratify=y, random_state=0

    • stratify로 각 숫자 클래스 비율 유지
    • 1000/100은 “학습은 적당히, 시각화는 100장을 한 번에”한다는 뜻..
  • 가우시안 노이즈:

    • noise ~ Normal(0, 0.25^2)
    • 테스트/학습에 각각 독립 노이즈를 더합니다.

MSE가 왜 약 0.06인가?
노이즈만 생각하면, 각 픽셀에 대해 E[ϵ2]=σ2\mathbb{E}[\epsilon^2] = \sigma^2 이므로

MSE0.252=0.0625\text{MSE} \approx 0.25^2 = 0.0625

이고 예제에서 보고되는 0.06과 비슷해집니다(표본 오차).


(3) plot_digits: 10x10 그리드로 100장 시각화

  • plt.subplots(nrows=10, ncols=10, figsize=(8,8))
  • img.reshape((16,16)) 해서 16x16 이미지로 복원해 보여줌

왜 16x16?

  • USPS는 16×16 픽셀 이미지(=256차원)로 제공됩니다.

(4) PCA vs KernelPCA 학습

  • PCA: n_components=32
  • KernelPCA:
    • n_components=400
    • kernel="rbf"
    • gamma=1e-3
    • fit_inverse_transform=True
    • alpha=5e-3

핵심 포인트는 KernelPCA는 inverse_transform이 “학습된 근사 함수”라는 점입니다.
fit_inverse_transform=True이면, “특징공간(커널 공간)에서의 저차원 좌표 → 원공간 이미지”로 되돌리는 함수를 추정합니다.


(5) 복원/디노이징

  • PCA:

    • xz=WTxx \to z = W^T x
    • x^=Wz+μ\hat x = W z + \mu (정확한 선형 복원)
  • KernelPCA:

    • xzx \to z 는 커널 기반 투영
    • x^\hat x 는 “pre-image” 근사 문제
      inverse_transform이 바로 이 근사 복원을 수행

예제 결과(원문 수치)

Noisy test images: MSE ≈ 0.06
PCA reconstruction: MSE ≈ 0.01
Kernel PCA reconstruction: MSE ≈ 0.03

원문은 “PCA의 MSE가 더 낮지만, KernelPCA는 배경 노이즈를 더 없애 더 부드럽게 보일 수 있다”는 정성 분석을 함께 제공합니다.


B-2. (B-Q1~Q7) 질문 답변

Q1. 왜 PCA가 이미지 노이즈를 제거하는가?

전제가 하나 있습니다: 신호는 저차원 구조(상관됨), 노이즈는 대체로 등방성(비상관)이고 분산이 작다.

  • PCA는 분산이 큰 방향(주성분)을 남기고 작은 방향을 버립니다.
  • 노이즈가 대체로 모든 방향에 골고루(등방성) 퍼져 있다면, “설명력이 낮은 방향”에 노이즈 성분이 많이 들어가고,
  • 상위 k개 성분으로만 복원하면 그 버려진 방향의 노이즈가 함께 제거됩니다.

즉, 디노이징은

x^=μ+i=1kzivi\hat x = \mu + \sum_{i=1}^{k} z_i v_i

라는 저랭크 근사(low-rank approximation)로 이해할 수 있습니다.


Q2. Why does Kernel PCA sometimes reconstruct better than PCA?

  • PCA는 선형 부분공간(평면) 근사만 가능.
  • 하지만 실제 이미지(숫자/얼굴)는 “조명/필기체 변화” 등으로 비선형 매니폴드를 이루는 경우가 많습니다.
  • KernelPCA는 커널 트릭으로 ϕ(x)\phi(x) 라는 고차원(혹은 무한차원) 특징공간에서 선형 PCA를 수행합니다.
    원공간에서는 비선형 구조를 더 잘 펼쳐서(“선형화”) 저차원 표현으로도 더 좋은 복원이 가능해집니다.

단, 복원(inverse)은 PCA처럼 닫힌형이 아니라 “근사”이므로, 파라미터(γ, α 등)에 따라 성능이 크게 달라집니다.


Q3. pre-image 문제란 무엇인가?

KernelPCA에서 투영은 특징공간 ϕ(x)\phi(x) 에서 이루어집니다.

  • 우리는 zz (커널 주성분 좌표)를 얻지만,
  • “ 그 zz에 대응하는 원공간의 xx ”를 정확히 되찾는 것은 일반적으로 불가능합니다.

즉,
zϕ(x)xz \mapsto \phi(x) \mapsto x
에서 마지막 역함수 ϕ1\phi^{-1} 가 없거나 계산 불가능한 상황이 pre-image problem입니다.

scikit-learn은 fit_inverse_transform=True에서 추정 문제(회귀)로 이를 근사해 해결합니다(예제는 “Learning to find pre-images”를 참고로 듭니다).


Q4. Why does Kernel PCA sometimes have lower MSE but higher visual quality?

(질문 문장 자체는 “둘 다 좋아짐”이라 모순은 없지만, 실제로는 아래 두 현상이 모두 가능합니다.)

1) MSE와 시각 품질이 같이 좋아지는 경우
KernelPCA가 매니폴드 구조를 잘 잡아 “진짜 숫자 모양”을 더 잘 복원하면

  • 픽셀 오차(MSE)도 감소
  • 구조(획/윤곽)도 또렷
    이때는 둘이 같이 개선됩니다.

2) MSE는 낮은데, 시각적으로는 별로인 경우(혹은 반대)

  • MSE는 픽셀 단위 평균제곱오차라, 사람이 중요하게 보는 “획의 선명도/구조”와 1:1로 맞지 않습니다.
  • 어떤 방법은 배경을 매끈하게 만들어 MSE를 줄이지만(노이즈 제거), 중요한 획을 조금 흐리게 만들 수 있습니다.
  • 반대로, 획을 선명하게 복원해 사람이 보기엔 좋은데, 픽셀 레벨로는 작은 오차들이 남아 MSE가 높을 수도 있습니다.

Q5. What is the geometry of Kernel PCA?

KernelPCA의 기하학은 “특징공간에서의 PCA”입니다.

1) 커널 정의: k(x,x)=ϕ(x),ϕ(x)k(x,x') = \langle \phi(x), \phi(x') \rangle
2) 훈련 샘플로 커널 행렬 KK 구성 후 중심화(center)
3) 고유분해:

Kcαj=nλjαjK_c \alpha_j = n\lambda_j \alpha_j

4) 새로운 점의 j번째 좌표는

zj(x)=i=1nαij  kc(xi,x)z_j(x) = \sum_{i=1}^{n} \alpha_{ij} \; k_c(x_i, x)

즉, 원공간에서 보면 비선형으로 휘어진 좌표계를 학습해 저차원으로 펼치는 것과 같습니다.
RBF 커널은 특히 “가까운 점들”의 관계를 강조하는 국소적(로컬) 기하를 만듭니다.


Q6. Why does PCA use fewer components (32) but Kernel PCA uses 400?

핵심 차이 3가지:

1) 선형 PCA는 보통 ‘적은 성분’으로도 큰 분산을 설명
숫자 이미지는 상관이 커서 상위 32개 PC만으로도 꽤 많은 구조를 담을 수 있습니다.

2) KernelPCA의 성분은 ‘샘플 수’에 의해 제한
KernelPCA는 (n_samples × n_samples) 커널 행렬의 고유벡터를 쓰므로, 성분 수는 최대 n_samples입니다.
예제는 train이 1000이므로 400을 택해 “비선형 표현력을 충분히” 확보합니다.

3) inverse_transform이 근사라서 성분 수가 너무 적으면 복원이 급격히 나빠질 수 있음
KernelPCA는 “좌표→원공간” 복원을 회귀로 근사하는데, 좌표 자체가 지나치게 압축되면 원공간 복원이 불안정합니다.


Q7. How do γ (gamma), α (alpha), n_components affect kernel PCA quality?

(1) γ (gamma): 커널 폭(길이 척도)

  • RBF: k(x,x)=exp(γxx2)k(x,x') = \exp(-\gamma \|x-x'\|^2)
  • γ가 작으면: 커널이 “넓다” → 멀리 있는 점도 비슷하게 봄 → 전역적으로 부드러운 표현(언더핏 위험이 잇슴)
  • γ가 크면: 커널이 “좁다” → 가까운 점만 영향 → 매우 복잡한 표현(오버핏/노이즈 학습 위험)

(2) α (alpha): inverse_transform(프리이미지 근사)의 정규화 강도

  • fit_inverse_transform=True일 때, scikit-learn은 inverse mapping을 ridge regression(L2 정규화)로 학습합니다.
  • α가 작으면: 학습 데이터를 과하게 따라가며 노이즈까지 맞출 수 있음(불안정)
  • α가 크면: 너무 매끈해져 디테일이 사라질 수 있음(underfit)

(3) n_components: 유지할 커널 주성분 수

  • 작을수록: 더 강한 압축 → 노이즈 제거엔 유리할 수 있으나 디테일 손실
  • 클수록: 복원력↑ 하지만 노이즈도 다시 살릴 위험↑ + 계산비용↑

B-3. 재밋게 파라미터 변화 실험

USPS 대신 load_digits(8×8=64차원)를 사용해 같은 절차를 실행해 보았습니다.

B-3-1) 기본 디노이징 성능(내장 digits, 노이즈 σ=0.25)

  • train 300 / test 100
  • 결과(MSE):
    • noisy: 0.06099
    • PCA(32) 복원: 0.03792
    • KernelPCA(RBF) 복원: 0.02314

→ KernelPCA가 더 낮은 MSE로 복원한 사례(매니폴드/비선형성 이점).


B-3-2) γ 변화 실험(고정: n_components=50, alpha=1e-2, train 200 / test 100)

  • γ=1e-3 → MSE 0.06967 (오히려 악화: 커널이 너무 넓어 구조를 못 잡음)
  • γ=1e-2 → MSE 0.02437 (개선)
  • γ=1e-1 → MSE 0.02678 (약간 악화: 너무 국소적/노이즈 영향 가능)

그러니까 γ는 “너무 작아도/커도” 망가지고, 데이터 스케일에 맞는 적정 폭이 필요합니다.


B-3-3) n_components 변화 실험(고정: gamma=1e-2, alpha=1e-2)

  • 10 → 0.03211
  • 30 → 0.02608
  • 50 → 0.02437

성분 수를 늘리면 복원력은 좋아지지만(오차 감소), 너무 늘리면 노이즈까지 복원될 수 있어 “적정점”을 찾아야 합니다.


B-3-4) α 변화 실험(고정: gamma=1e-2, n_components=50)

  • α=1e-3 → 0.03799 (불안정/과적합 가능)
  • α=1e-2 → 0.02437 (가장 좋음)
  • α=1e-1 → 0.04890 (과도한 정규화로 복원력 저하)

결론

1) Eigenfaces는 “얼굴 데이터의 주된 변동 패턴”을 저차원 기저로 만든 것이며, 분류기는 그 좌표(계수) 공간에서 학습됩니다.
2) PCA는 차원 축소 + 노이즈 억제 + 상관 제거로 고차원 이미지 문제를 전통 ML 모델이 다룰 수 있게 만듭니다.
3) Whitening은 거리 기반 모델의 등방성 가정에 도움을 줄 수 있지만, 항상 이득이 아니며 데이터/노이즈 구조에 따라 성능을 깎을 수도 있습니다.
4) 디노이징에서 KernelPCA는 비선형 매니폴드를 더 잘 따라가 복원이 좋아질 수 있지만, inverse_transform이 pre-image 근사 문제이므로 (γ, α, n_components) 튜닝이 성능을 좌우합니다.


참고(원문 예제/문서)

보고서작성할 때 읽은 닥스들입니다.

scikit-learn Eigenfaces example:
https://scikit-learn.org/stable/auto_examples/applications/plot_face_recognition.html

scikit-learn Denoising using kernel PCA example:
https://scikit-learn.org/stable/auto_examples/applications/plot_digits_denoising.html

PCA API:
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html

KernelPCA API:
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.KernelPCA.html
profile
Hi, I'm KiMH

0개의 댓글