본문 바로가기
머신러닝 with Python

[머신러닝 with Python] Kernel PCA란?

by CodeCrafter 2024. 11. 24.
반응형

 

이번에 알아볼 내용은 PCA의 변형 형태인 Kernel PCA입니다.

 

기존 PCA 관련 내용은 아래 포스팅을 참조해서 보고 오시면 좋으실 것 같습니다.

 

[머신러닝 with 파이썬] PCA / 주성분 분석 / 차원축소 /iris 데이터 활용

 

[머신러닝 with 파이썬] PCA / 주성분 분석 / 차원축소 /iris 데이터 활용

이번에 알아볼 것은 차원축소 알고리즘의 대표적인 PCA(주성분 분석)에 대해서 알아보겠습니다. Tabular type의 데이터에서 차원을 축소한다는 것은 곧, 변수의 개수(또는 피처의 개수)를 줄인다는

jaylala.tistory.com

 

1. Kernel PCA

- Kernel pCA란, 비선형 데이터의 주요 구성요소를 찾기 위해 커널 트릭을 사용하는 PCA의 확장 버전입니다.

 

- 일반적인 PCA는 데이터의 선형 차원 축소에 유용하지만, 비선형적으로 분포된 데이터에는 한계가 있으며, 이런 비선형성을 처리하기 위해 Kernel PCA는 원본 데이터를 고차원 공간으로 매핑하여, 그 공간에서 선형 변환을 수행하는 것입니다.

 

- Kernel PCA가 이루어지는 주요 내용은 아래와 같습니다.

 

1) 원본 데이터의 Representation

 * 주어진 데이터가 아래와 같이 존재하다고 가정해 봅니다. 이 데이터는 비선형적으로 분포되어 있다고 가정하며, 이 경우 단순한 선형 PCA의 경우 비효율적일 수 있습니다.

 

 2) 고차원 feature space로 매핑

 * Kernel PCA에서는 원본 데이터를 고차원 Feature Space인 F로 매핑하여 비선형성을 처리합니다. 이를 위해 매핑 함수인 theta를 사용하여 각 데이터 포인트 xi를 고차원 공간으로 매핑합니다.

 

 * 이때 매핑된 데이터는 아래와 같습니다. 이 고차원 공간에서 데이터가 선형적으로 분포되어 있을 것으로 가정하고, PCA를 수행하고자 합니다.

 

3) 커널 함수의 사용

 * 직접 고차원 feature space로 매핑을 수행하는 것은 계산 비용이 많이 들 수 있기 때문에, 아래와 같은 커널 함수를 사용하여 두 데이터 포인트 간의 유사도를 계산합니다. 

 * 이때 자주 사용되는 커널 함수의 예로는 아래와 같이  RBF(Radial Basis Function) 또는 Polynomial 등 있습니다.

 

4) 커널 행렬 K

 * 모든 데이터 쌍 (xi, xj)에 대해 커널 함수를 적용하여 커널 행렬 K를 구합니다.

 

5) 중심화된 커널 행렬

 * 고차원 공간에서 데이터가 중심화되어 있어야 PA가 제대로 작동하므로, K 행렬을 중심화합니다. 중심화된 커널 행렬은 다음과 같이 계산됩니다.

 

6) Eigenvalue Decomposition

 * 중심화된 커널 행렬에 대해 Eigenvalue Decomposition을 수행하여 고유값과 고유 벡터를 구해냅니다. 

 

 

7) Principal Component 요소로의 Projection

 * 데이터 xi의 Principal components인 

  를 찾기위해, Eigen vector인 alpha k에 대한 선형결합을 사용합니다. 

 

 

 

- 위 과정을 요약을 해보자면

 * 고차원으로 매핑

 * 커널함수를 사용해 고차원 매핑을 간접적으로 처리

 * Eigenvalue decomposition을 통해 차원을 축소 

 라고 볼 수 있습니다.

 

2. 예시 데이터를 통해 알아보는 Kernel PCA

- 이번에는 예시 데이터를 생성해서 일반적인 PCA와 Kernel PCA(RBF Kernel, Polynomial Kernel)을 처리했을 때 어떻게 다르게 나타나는지 알아보겠습니다.

 

- 사용할 데이터는 3D Swiss Roll 함수를 활용해서 생성하겠습니다. 전체 코드는 아래와 같습니다.

 

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import make_swiss_roll
from sklearn.metrics.pairwise import rbf_kernel, polynomial_kernel

# 스위스 롤 데이터 생성
np.random.seed(0)
X, _ = make_swiss_roll(n_samples=1000, noise=0.05)

# 1. 일반 PCA 적용
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 2. RBF 커널 PCA 적용
sigma = 10  # RBF 커널의 매개변수 (조정 가능)
K_rbf = rbf_kernel(X, gamma=1 / (2 * sigma**2))
pca_rbf = PCA(n_components=2)
X_rbf_pca = pca_rbf.fit_transform(K_rbf)

# 3. 폴리노미얼 커널 PCA 적용
degree = 3  # 폴리노미얼 커널의 차수
coef = 1    # 폴리노미얼 커널의 상수항
K_poly = polynomial_kernel(X, degree=degree, coef0=coef)
pca_poly = PCA(n_components=2)
X_poly_pca = pca_poly.fit_transform(K_poly)

# 시각화
fig = plt.figure(figsize=(20, 5))

# 원본 스위스 롤 데이터 (3D 시각화)
ax = fig.add_subplot(141, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=X[:, 0], cmap='Spectral', s=5)
ax.set_title("Original Data (3D Swiss Roll)")

# 일반 PCA 결과
plt.subplot(1, 4, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=X[:, 0], cmap='Spectral', s=5)
plt.title("Linear PCA")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")

# RBF 커널 PCA 결과
plt.subplot(1, 4, 3)
plt.scatter(X_rbf_pca[:, 0], X_rbf_pca[:, 1], c=X[:, 0], cmap='Spectral', s=5)
plt.title(f"RBF Kernel PCA (σ={sigma})")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")

# 폴리노미얼 커널 PCA 결과
plt.subplot(1, 4, 4)
plt.scatter(X_poly_pca[:, 0], X_poly_pca[:, 1], c=X[:, 0], cmap='Spectral', s=5)
plt.title(f"Polynomial Kernel PCA (degree={degree}, coef={coef})")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")

plt.tight_layout()
plt.show()

 

 

- 위 결과를 보시면

 * Original Data인 3D Swiss Roll 데이터는 비선형 구조가 강한 3차원 데이터로, 단순한 선형 변환으로는 쉽게 주성분을 찾을 수 없는 구조를 가지고 있습니다.

 * Linear PCA를 적용한 결과를 보시면 데이터의 비선형 구조를 잘 확인하지 못하고 스위스 롤 구조가 퍼진 형태로 PC1과 PC2의 차원에 투영된 것을 볼 수 있습니다.

 * RBF Kernel PCA를 적용한 결과르 보시면 데이터의 곡선 구조를 잘 유지하면서 차원을 축소한 것을 알 수 있습니다.

 * Polynomial Kernel PCA를 적용한 결과를 보시면, 현재 주어진 파라미터 설정으로는 데이터의 원형 패턴을 RBF만큼 잘 반영하지는 못하고 있음을 알 수 있습니다. 하지만 여전히 비선형 변환 효과가 보이는 것처럼 느껴집니다. 

 

- 전반적으로 3차원의 Swiss Roll 데이터의 경우, RBF Kernel이 차원 축소를 데이터의 특징을 잘 반영해서 한 것을 알 수 있습니다. 

 

 

 

 

 

 

반응형

댓글