0
4

More than 1 year has passed since last update.

理解したい!カーネル主成分分析まとめ

Posted at

このスライドについて

以前にカーネル法について自分なりにまとめたものです。カーネル法の概念は大変難しく、専門でない自分にはかなり苦労しました。間違っているところがあったら教えていただけたら嬉しいです。
image.png

目次

image.png

PCA 主成分分析の概要

image.png

image.png
image.png

カーネルPCAの概要

image.png
image.png
image.png

カーネルPCAの導出

image.png
image.png
image.png
image.png

カーネルトリックについて

image.png
image.png

image.png
image.png

カーネル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()

make_moons.png

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')

kernel_pca.png

make_moon datasetのカーネルPCA

image.png

まとめ

image.png

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4