Isomapによるデータの非線形次元圧縮を実装します。
PCAが機能しない非線形な構造を持つデータにおいて、データ数が膨大でない場合にIsomapが使用されます。
Isomapは、scikit-learnのアルゴリズムチートマップの以下の黒矢印に対応します。
次元圧縮→PCA機能せず→サンプル数1万以下→[Isomap]
です。
Isomapの実装
本記事ではムーンのサンプルデータを使用して、次元圧縮を行います。
実装コードは以下の通りです。
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 | # 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:Spectral Embeddingを実施------------------------------- se = manifold.SpectralEmbedding(n_components=2, affinity='nearest_neighbors') X_se = se.fit_transform(X) # 解説5:Isomapを実施------------------------------- isomap = manifold.Isomap(n_neighbors=10, n_components=2) X_isomap = isomap.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_se[:,0],X_se[:,1], c=Y) plt.xlabel('SE-1') plt.ylabel('SE-2') plt.subplot(3, 1, 3) plt.scatter(X_isomap[:,0],X_isomap[:,1], c=Y) plt.xlabel('IM-1') plt.ylabel('IM-2') plt.show |
結果は次の通りになります。
結果のグラフ(上)が、元データです。
線形には判別できない非線形なデータ構造をしています。
前回のSpectral Embeddingを実施した結果が、(真ん中)のグラフです。
グラフ(下)が今回のIsomapの結果となります。
Spectral Embeddingとは結果が異なりますが、データ構造がより分かりやすいように、新たな軸が作られていることが分かります。
コードを解説します。
# 解説5:Isomapを実施——————————-
isomap = manifold.Isomap(n_neighbors=10, n_components=2)
X_isomap = isomap.fit_transform(X)
取り出す次元の数を2に指定し、多様体を求めるためにいくつの近傍の点を考慮するのかを、n_neighbors=10に指定しています。
それでは「結局、Isomapって何をやっていたの?」を説明します。
Isomapの心
正確な情報は以下をご覧ください。
Isomapは多様体上の距離を測定し、多次元尺度構成法で表現した次元圧縮手法です。
何やら難しい名前のオンパレードですが、簡単に説明します。
3次元空間にデータが分布していたとしても、実はとある平面上に分布していたとすると,
データの次元は2次元で表すことができます。
このように実はN次元のデータですが、Nより小さな次元の平面や曲がった平面(多様体)の上にデータがのっている場合にIsomapが適用できます。
こちらの図がとても分かりやすいです。
[引用:Rでisomap(多様体学習のはなし)]
各データの多様体上での距離を求めるのは、一見難しそうですが、単純に近いデータとのつながりを使用します。
こうして各データがその他のデータとどうつながっているのかというグラフ行列に似た「測地線距離行列」が生成されます。
あとは「多次元尺度構成法」で測地線距離行列を低次元で表します。
多次元尺度構成法は測地線距離行列が似ているものは近くに、似ていないものは遠くに配置する方法です。
以上の方法によりIsomapで次元圧縮を行うことができます。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第24回:Isomapでの次元圧縮でした。
次回はLLEによる次元圧縮について説明します。