Kernel-PCA(主成分分析)によるデータの非線形次元圧縮を実装します。
PCAは固有値分解であり、線形変換です。
そのためデータ構造が非線形な場合には、うまくいかない場合があります。
そのような場合に、Kernel PCAが使用されます。
Kernel PCAはカーネルトリックを用いて、データを非線形変換した後にPCAを実施する方法です。
Kernel PCAは、scikit-learnのアルゴリズムチートマップの以下の黒矢印に対応します。
次元圧縮→PCA機能せず→サンプル数1万以上→[Kernel PCA]
です。
Kernel-PCAの実装
本記事ではムーンのサンプルデータを使用して、次元圧縮を行います。
実装コードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # 1:ライブラリのインポート-------------------------------- import numpy as np #numpyという行列などを扱うライブラリを利用 import pandas as pd #pandasというデータ分析ライブラリを利用 import matplotlib.pyplot as plt #プロット用のライブラリを利用 from sklearn import cross_validation, preprocessing, decomposition #機械学習用のライブラリを利用 from sklearn import datasets #使用するデータ # 2:moon型のデータを読み込む-------------------------------- X,Y = datasets.make_moons(n_samples=200, noise=0.05, random_state=0) # 3:データの整形------------------------------------------------------- sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X) # 4:主成分分析を実施------------------------------- pca = decomposition.PCA(n_components=2) X_pca = pca.fit_transform(X) # 解説5:カーネル主成分分析を実施------------------------------- kpca = decomposition.KernelPCA(n_components=2, kernel='rbf', gamma=20.0) X_kpca = kpca.fit_transform(X) # 6: 結果をプロットする----------------------------- %matplotlib inline plt.figure(figsize=(10,10)) plt.subplot(3, 1, 1) plt.scatter(X[:,0],X[:,1], c=Y) plt.xlabel('x') plt.ylabel('y') plt.subplot(3, 1, 2) plt.scatter(X_pca[:,0],X_pca[:,1], c=Y) plt.xlabel('PC1') plt.ylabel('PC2') plt.subplot(3, 1, 3) plt.scatter(X_kpca[:,0],X_kpca[:,1], c=Y) plt.xlabel('K-PC1') plt.ylabel('K-PC2') plt.show |
結果は次の通りになります。
結果のグラフ(上)が、元データです。
線形には判別できない非線形なデータ構造をしています。
このムーンデータにPCAを実施したのがグラフ(中)です。
元データとそれほど結果が変わっておらず、機能していないことが分かります。
最後にKernel PCAを実施したのが、一番下のグラフです。
データ構造がより分かりやすいように、新たな軸が作られていることが分かります。
コードを解説します。
# 解説5:カーネル主成分分析を実施——————————-
kpca = decomposition.KernelPCA(n_components=2, kernel=’rbf’, gamma=20.0)
X_kpca = kpca.fit_transform(X)
取り出す次元の数を2に指定し、カーネルをrbfカーネル(ガウスカーネル)にしています。
gammaはガウスカーネルの形(分散)を決めています。
それでは「結局、Kernel PCAって何をやっていたの?」を説明します。
Kernel PCAの心
正確な情報は以下をご覧ください。
●scikit-learnのdecompositonの解説ページ
●scikit-learnのKernel PCAの解説ページ
Kernel PCAはカーネルトリックを用いて、データを非線形変換した後にPCAを実施する方法です。
今回の実装例は、2次元から2次元への変換なので次元縮約にはなっていませんが、よりデータの特徴を捉えやすい構造に変換されていることがわかります。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第22回:Kernel PCAでの次元圧縮でした。
次回はSpectral Embeddingによる次元圧縮について説明します。