LLE(LocallyLinearEmbedding)によるデータの非線形次元圧縮を実装します。
非線形な構造を持つデータにおいて、Isomapがうまくいかない場合に、LLEが使用されます。
LLEは、scikit-learnのアルゴリズムチートマップの以下の黒矢印に対応します。
次元圧縮→PCA機能せず→サンプル数1万以下→Isomapが機能せず→[LLE]
です。
LLEの実装
本記事ではムーンのサンプルデータを使用して、次元圧縮を行います。
実装コードは以下の通りです。
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:Isomapを実施------------------------------- isomap = manifold.Isomap(n_neighbors=10, n_components=2) X_isomap = isomap.fit_transform(X) # 解説5:LLEを実施------------------------------- lle = manifold.LocallyLinearEmbedding(n_neighbors=10, n_components=2) X_lle = lle.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_isomap[:,0],X_isomap[:,1], c=Y) plt.xlabel('IM-1') plt.ylabel('IM-2') plt.subplot(3, 1, 3) plt.scatter(X_lle[:,0],X_lle[:,1], c=Y) plt.xlabel('LLE-1') plt.ylabel('LLE-2') plt.show |
結果は次の通りになります。
結果のグラフ(上)が、元データです。
線形には判別できない非線形なデータ構造をしています。
前回のIsompaを実施した結果が、(真ん中)のグラフです。
グラフ(下)が今回のLLEの結果となります。
Isomapとは結果が異なりますが、データ構造がより分かりやすいように、新たな軸が作られていることが分かります。
コードを解説します。
# 解説5:LLEを実施——————————-
lle = manifold.LocallyLinearEmbedding(n_neighbors=10, n_components=2)
X_lle = lle.fit_transform(X)
取り出す次元の数を2に指定し、多様体を求めるためにいくつの近傍の点を考慮するのかを、n_neighbors=10に指定しています。
それでは「結局、LLEって何をやっていたの?」を説明します。
LLEの心
正確な情報は以下をご覧ください。
LLEは多様体上での距離を求める点はIsomapと同じです。
LLEはその後、多様体上で近くのデータ同士は線形な関係で表されるという拘束のもとで次元を圧縮するようです。
とても難しいので、私もこれ以上はよくわかっていません。
申し訳ございません。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第25回:LLEでの次元圧縮でした。