【기계 학습】Kernel PCA를 공부해 본다

PCA



Kernel PCA의 설명에 들어가기 전에 PCA란 무엇인가, 대략 드러내고 싶습니다.

PCA란?



PCA(Principle Component Analysis)/주성분 분석은 기계 학습에서 주로 데이터의 차원을 줄이는 데 사용되는 기술입니다. 「차원의 저주」라고도 알려지도록, 특징량이 너무 많으면 학습에 지장을 줍니다. 그래서 "불필요한 특징량은 가능한 한 제거하고 싶다. 정말 필요한 특징량만을 사용하고 싶다"입니다.

PCA의 메커니즘



각 $x_i$가 D차원(D개의 특징량) 벡터의 데이터 세트를 가지고 있다고 가정합니다. 이것을 M차원에 찍는데, y = Ax 가 되는 $A = [u_1^{T}, ... u_M^{T}]$, $u_k^{T}u_k = 1, k = 1,2 ... M$이 있다고 가정합니다. 이때 PCA에서는 $y_i$의 분산이 최대가 되는 A를 찾습니다.
A^* = argmax tr(S_y)
S_y=\dfrac {1}{N}\sum ^{N}_{i=1}\left( y_{i}-\overline {y}\right) \left( y_{i}-\overline {y}\right) ^{T}
\overline {y} = \dfrac {1}{N}\sum ^{N}_{i=1}x_i

$S_x$를 S의 분산 공분산 행렬로 했을 때, $tr(S_y) = tr(AS_xA^T)$ 에 의해, 라그랑지 정수를 사용 미분하면, ​​아래와 같은 고유치 벡터 $u_k$ 에 의한 식이 됩니다 .

S_xu_k = \lambda_ku_k

이와 같이 PCA에서는 x의 분산이 최대가 되는 고유치를 취함으로써 특징량을 좁힐 수 있습니다.
이 고유치 벡터에 의한 매핑은 아래와 같은 회전사 이미지가 됩니다.
세로와 가로의 퍼짐인 각각의 특징량의 분산만이 남은 것을 알 수 있습니다.



커널 PCA



위의 PCA에서는 선형 분리할 수 있는 데이터에 대해서 차원 삭제를 실시했습니다만, 데이터가 선형 분리할 수 없을 때 Kernel PCA를 사용합니다.
D차원의 특징량을 가진 데이터를 M차원에 찍는 $\phi(x)$가 있다고 합니다. 이 때 표준 PCA를 새로운 차원 공간에서 할 수 있지만, 힘들기 때문에 커널 트릭을 사용합니다.
우선, 매핑 후의 특징량은 평균 0을 취한다고 가정합니다.
\dfrac {1}{N}\sum ^{N}_{i=1} \phi(x_i) = 0

이때 분산공분산은
C = \dfrac {1}{N}\sum ^{N}_{i=1} \phi(x_i)\phi(x_i)^T


됩니다.
고유값 벡터 $v_i$는 아래 수식에서 구할 수 있습니다.
Cv_k = \lambda_k v_k      

예를 들어 아래와 같이 왼쪽 데이터에서는 선형 분리할 수 없지만 커널을 사용하면 선형 분리가 가능합니다.



scikit learn Kernel PCA




매개변수
개요
선택
기본


n_components
타겟의 차원 수
int
None(그대로)

커널
커널 타입
“linear” ,“poly” , “rbf” ,“sigmoid” ,“cosine”
"linear"

gamma
rbf와 poly의 커널 계수
float
1/n_features

degree
poly 계수
int
3

coef0
poly와 sigmoid의 독립 계수
float
1

kernel_params
커널 매개 변수의 이름
String에서 mapping
None

알파
리지 회귀

1.0

eigen_solver
고유값 선택
"auto", "dense", "arpack"
"자동"

tol
arpack 수렴
float
0

max_iter
arpack의 최대 반복 횟수
int
None

remove_zeros
고유치 0 삭제
bool
거짓

random_state
arpack의 random_state
RandomState Instance or None
None

n_jobs
병렬 작업
int/None
None


사용 예



import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA, KernelPCA
from sklearn.datasets import make_circles
np.random.seed(0)
X, y = make_circles(n_samples=400, factor=.3, noise=.05)
plt.figure(figsize=(10,10))
plt.subplot(2, 2, 1, aspect='equal')
plt.title("Original space")
reds = y == 0
blues = y == 1
plt.scatter(X[reds, 0], X[reds, 1], c="red",s=20, edgecolor='k')
plt.scatter(X[blues, 0], X[blues, 1], c="blue",s=20, edgecolor='k')
plt.xlabel("$x_1$")
plt.ylabel("$x_2$")



-> 선형분열할 수 없다. . .
RBF 커널!
kpca = KernelPCA(kernel="rbf", fit_inverse_transform=True, gamma=10)
X_kpca = kpca.fit_transform(X)
pca = PCA()
X_pca = pca.fit_transform(X)
plt.scatter(X_kpca[reds, 0], X_kpca[reds, 1], c="red",s=20, edgecolor="k")
plt.scatter(X_kpca[blues, 0], X_kpca[blues, 1], c="blue",s=20, edgecolor="k")
x = np.linspace(-1, 1, 1000)
plt.plot(x, -0.1*x, linestyle="solid")
plt.title("Projection by KPCA")
plt.xlabel(r"1st PC induced by $\phi$")
plt.ylabel("2nd component")



분할 후:



PCA의 장점과 단점



장점


  • 특징량 간의 관계를 무시할 수 있다.
  • 학습이 간단하고 빠릅니다.
  • 과학습을 방지한다.
  • 보다 이해하기 쉬운 시각화.

  • 단점


  • 원래의 특징량의 해석이 어려워진다.
  • 정규화 필요.

  • 인용



    Quan Wang, "Kernel Principal Component Analysis and its Applications in Face Recognition and Active Shape Models", 2014
    htps : // / r ぃ v. rg / pdf / 1207. 3538. pdf

    좋은 웹페이지 즐겨찾기