スイスロールとスイスホールの次元削減

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、古典的なスイスロールデータセットにおいて、2 つの人気のある非線形次元削減手法、局所的線形埋め込み(Locally Linear Embedding:LLE)と T 分布確率的近傍埋め込み(t-distributed Stochastic Neighbor Embedding:t-SNE)を比較します。また、データに穴を追加した場合にどのように対処するかを検討します。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題がある場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。

スイスロールデータセットの生成

まず、sklearn.datasetsmake_swiss_roll() 関数を使ってスイスロールデータセットを生成します。この関数は、渦巻き状の 3 次元データセットを生成します。

import matplotlib.pyplot as plt
from sklearn import manifold, datasets

sr_points, sr_color = datasets.make_swiss_roll(n_samples=1500, random_state=0)

スイスロールデータセットの可視化

生成されたスイスロールデータセットを、異なる点を表す異なる色で 3D 散布図を使って可視化することができます。

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(sr_points[:, 0], sr_points[:, 1], sr_points[:, 2], c=sr_color, s=50, alpha=0.8)
ax.set_title("Swiss Roll in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)

スイスロールデータセットの LLE と t-SNE 埋め込みの計算

sklearnmanifold.locally_linear_embedding()manifold.TSNE() 関数をそれぞれ使って、スイスロールデータセットの LLE と t-SNE 埋め込みを計算します。

sr_lle, sr_err = manifold.locally_linear_embedding(sr_points, n_neighbors=12, n_components=2)

sr_tsne = manifold.TSNE(n_components=2, perplexity=40, random_state=0).fit_transform(sr_points)

スイスロールデータセットの LLE と t-SNE 埋め込みの可視化

異なる点を表す異なる色で散布図を使って、スイスロールデータセットの LLE と t-SNE 埋め込みを可視化することができます。

fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sr_lle[:, 0], sr_lle[:, 1], c=sr_color)
axs[0].set_title("LLE Embedding of Swiss Roll")
axs[1].scatter(sr_tsne[:, 0], sr_tsne[:, 1], c=sr_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss Roll")

スイスホールデータセットの生成

make_swiss_roll() 関数の hole=True パラメータを使って、スイスロールデータセットに穴を追加することで、スイスホールデータセットを生成します。

sh_points, sh_color = datasets.make_swiss_roll(n_samples=1500, hole=True, random_state=0)

スイスホールデータセットの可視化

生成されたスイスホールデータセットを、異なる点を表す異なる色で 3D 散布図を使って可視化することができます。

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(sh_points[:, 0], sh_points[:, 1], sh_points[:, 2], c=sh_color, s=50, alpha=0.8)
ax.set_title("Swiss-Hole in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)

スイスホールデータセットの LLE と t-SNE 埋め込みの計算

sklearnmanifold.locally_linear_embedding()manifold.TSNE() 関数をそれぞれ使って、スイスホールデータセットの LLE と t-SNE 埋め込みを計算します。

sh_lle, sh_err = manifold.locally_linear_embedding(sh_points, n_neighbors=12, n_components=2)

sh_tsne = manifold.TSNE(n_components=2, perplexity=40, init="random", random_state=0).fit_transform(sh_points)

スイスホールデータセットの LLE と t-SNE 埋め込みの可視化

異なる点を表す異なる色で散布図を使って、スイスホールデータセットの LLE と t-SNE 埋め込みを可視化することができます。

fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sh_lle[:, 0], sh_lle[:, 1], c=sh_color)
axs[0].set_title("LLE Embedding of Swiss-Hole")
axs[1].scatter(sh_tsne[:, 0], sh_tsne[:, 1], c=sh_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss-Hole")

まとめ

この実験では、古典的なスイスロールデータセットとスイスホールデータセットの LLE と t-SNE 埋め込みを比較しました。データセットとその埋め込みを散布図を使って可視化しました。LLE がスイスロールとスイスホールデータセットを効果的に展開できた一方、t-SNE はデータの一般的な構造を保っていましたが、点の区画をまとめる傾向があることを観察しました。