SpectralEmbeddingによるデータの非線形次元圧縮を実装します。
PCAが機能しない非線形な構造を持つデータにおいて、データ数が膨大でない場合にSpectralEmbeddingが使用されます。
SpectralEmbeddingは、scikit-learnのアルゴリズムチートマップの以下の黒矢印に対応します。
次元圧縮→PCA機能せず→サンプル数1万以下→[SpectralEmbedding]
です。
SpectralEmbeddingの実装
本記事ではムーンのサンプルデータを使用して、次元圧縮を行います。
実装コードは以下の通りです。
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, manifold #機械学習用のライブラリを利用 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:カーネル主成分分析を実施------------------------------- kpca = decomposition.KernelPCA(n_components=2, kernel='rbf', gamma=20.0) X_kpca = kpca.fit_transform(X) # 解説5:Spectral Embeddingを実施------------------------------- spca = manifold.SpectralEmbedding(n_components=2, affinity='nearest_neighbors') X_spca = spca.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_kpca[:,0],X_kpca[:,1], c=Y) plt.xlabel('K-PC1') plt.ylabel('K-PC2') plt.subplot(3, 1, 3) plt.scatter(X_spca[:,0],X_spca[:,1], c=Y) plt.xlabel('S-PC1') plt.ylabel('S-PC2') plt.show |
結果は次の通りになります。
結果のグラフ(上)が、元データです。
線形には判別できない非線形なデータ構造をしています。
前回のカーネルPCAを実施した結果が、(真ん中)のグラフです。
グラフ(下)が今回のSpectralEmbeddingの結果となります。
Kernel PCAとは異なりますが、データ構造がより分かりやすいように、新たな軸が作られていることが分かります。
コードを解説します。
# 解説5:Spectral Embeddingを実施——————————-
spca = manifold.SpectralEmbedding(n_components=2, affinity=’nearest_neighbors’)
X_spca = spca.fit_transform(X)
取り出す次元の数を2に指定し、グラフ行列を作成するための方法をnearest_neighborsに指定しています。
それでは「結局、SpectralEmbeddingって何をやっていたの?」を説明します。
SpectralEmbeddingの心
正確な情報は以下をご覧ください。
●scikit-learnのSpectralEmbeddingの解説ページ
Spectral Clusteringの場合と同じく、M個のデータをまずM×Mのグラフ行列へと変換します。
そしてこのM×Mの行列を固有値分解することで、次元を圧縮します。
Spectral Embeddingは結局、各データ点がその他全部のデータ点とどうつながっているのかという情報を用いて、データの次元を圧縮していることになります。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第23回:Spectral Embeddingでの次元圧縮でした。
次回はIsomapによる次元圧縮について説明します。