このスライドについて
以前にカーネル法について自分なりにまとめたものです。カーネル法の概念は大変難しく、専門でない自分にはかなり苦労しました。間違っているところがあったら教えていただけたら嬉しいです。
目次
PCA 主成分分析の概要
カーネルPCAの概要
カーネルPCAの導出
カーネルトリックについて
カーネルPCAの実装
ここでは簡単にRBFカーネルをscipy
などを用いて実装してみる。
実際に使う際は絶対sklearn
がいい!
from scipy.spatial.distance import pdist, squareform
from scipy import exp
from scipy.linalg import eigh
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import make_moons
X,y = make_moons(n_samples=100)
X1 = X[:,0]
X2 = X[:,1]
plt.scatter(x=X1, y=X2, c=y)
plt.title('make_moos')
plt.show()
def rbf_kernel_pca(X, gamma, n_components):
#M N 次元のデータセットでペアごとのユークリッド距離の二乗を計算
sq_dists = pdist(X, 'sqeuclidean')
#ペアごとの距離を正方行列に変換
mat_sq_dists = squareform(sq_dists)
#対称カーネル行列に変換
K = exp(-gamma * mat_sq_dists)
#カーネル行列の中心化
N = K.shape[0]
one_n = np.ones((N,N)) / N
K = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)
#固有値固有ベクトルの取得
eigvals, eigvecs = eigh(K)
eigvals, eigvecs = eigvals[::-1], eigvecs[:, ::-1]
#上位の固有ベクトルの収集
X_pc = np.column_stack((eigvecs[:, i] for i in range(n_components)))
return X_pc
X_kpca = rbf_kernel_pca(X=X, gamma=50, n_components=2)
X1_kpca = X_kpca[:,0]
X2_kpca = X_kpca[:,1]
plt.scatter(x=X1_kpca, y=X2_kpca, c=y)
plt.title('make_moos KernelPCA')
plt.savefig('kernel_pca')