0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

次元削減アルゴリズムの使い分け(主にTSNE)

Posted at

次元削減アルゴリズムの使い分け

image.png

t-SNEと既存の次元削減アルゴリズムの違い

次元削減アルゴリズムにはいくつかの種類がありますが、t-SNEは特に「非線形次元削減」として注目されています。他のアルゴリズムとの違いを以下にまとめます。

t-SNEと主成分分析(PCA)の違い

特性 t-SNE PCA
目的 局所的な類似性を維持する 線形関係を維持する
アルゴリズムの種類 非線形次元削減 線形次元削減
結果の解釈 クラスターが視覚的に分離される 分散が最大となる軸に沿った次元削減
計算コスト 高い(データサイズが大きいと遅くなる) 比較的低い
応用範囲 データのクラスタリングや可視化 主成分の意味を考えるデータ解析
制限 データのグローバル構造は失われる場合がある 非線形な構造は捉えられない

t-SNEの特徴

  • 強み:
    • 局所的な類似性を非常によく表現。
    • データクラスタリングや視覚化に適している。
  • 弱み:
    • 計算コストが高い。
    • グローバル構造が必ずしも保存されない。

t-SNEは特に視覚化目的で優れていますが、データの特性に応じて他の手法との使い分けが重要。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.manifold import TSNE

# Irisデータセットを読み込む
data = load_iris()
X = data.data
y = data.target

# t-SNEで次元削減
tsne = TSNE(n_components=2, random_state=42, perplexity=30, n_iter=1000)
X_tsne = tsne.fit_transform(X)

# 結果を可視化
plt.figure(figsize=(8, 6))
for target in np.unique(y):
    plt.scatter(X_tsne[y == target, 0], X_tsne[y == target, 1], label=f"Class {target}")
plt.title("t-SNE Visualization of Iris Dataset")
plt.xlabel("Component 1")
plt.ylabel("Component 2")
plt.legend()
plt.show()

image.png

全体の流れ

  1. irisデータセットを取得し、特徴量とクラスラベルに分ける。
  2. ランダムに100サンプルを抽出して計算負荷を軽減。
  3. t-SNEを用いて4次元データを2次元に次元削減。
  4. 次元削減後のデータをクラスごとに色分けして散布図として可視化。

スイスロールデータでt-SNEを実装してみる

import numpy as np
from sklearn.datasets import make_swiss_roll
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 1. スイスロールデータの生成(高次元データ)
X, color = make_swiss_roll(n_samples=1000, noise=0.1, random_state=42)

# 2. t-SNEで低次元に変換(2次元)
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_embedded = tsne.fit_transform(X)

# 3. 可視化
# 3次元データのプロット
fig = plt.figure(figsize=(16, 6))
ax = fig.add_subplot(121, projection='3d')
scatter = ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.set_title("Original 3D Data (Swiss Roll)")
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

# 2次元データのプロット
ax2 = fig.add_subplot(122)
scatter2 = ax2.scatter(X_embedded[:, 0], X_embedded[:, 1], c=color, cmap=plt.cm.Spectral)
ax2.set_title("2D Visualization by t-SNE")
ax2.set_xlabel("Dimension 1")
ax2.set_ylabel("Dimension 2")

plt.colorbar(scatter2, ax=ax2, label='Data Color Mapping')
plt.tight_layout()
plt.show()

image.png

  1. 3次元プロット:高次元のスイスロールデータ。データはねじれたリボン状。
  2. 2次元プロット:右側のグラフでは、t-SNEを用いて2次元に変換されたデータが表示。元の構造を保ちながら2次元に圧縮されている。

t-SNEの実行ステップ

  • 1.高次元での類似度計算
from scipy.spatial.distance import pdist, squareform

# ユークリッド距離を計算
distances = squareform(pdist(X, 'euclidean')) ** 2

# ガウス分布に基づく条件付き確率 p_{j|i} を計算
P = np.exp(-distances / (2 * np.var(X)))
np.fill_diagonal(P, 0)  # 自分自身との類似度は0に
P /= np.sum(P, axis=1, keepdims=True)  # 確率として正規化
  • 2.低次元での配置
# 初期配置(ランダム)
Y = np.random.randn(X.shape[0], 2)

# 低次元での類似度計算
distances_low = squareform(pdist(Y, 'euclidean')) ** 2
Q = 1 / (1 + distances_low)
np.fill_diagonal(Q, 0)
Q /= np.sum(Q)  # 確率として正規化
  • 3.勾配降下法による最適化
# コスト関数の勾配計算
grad = np.zeros_like(Y)
PQ_diff = P - Q
for i in range(Y.shape[0]):
    grad[i] = 4 * np.sum((PQ_diff[i, :, None] * (Y[i] - Y)) / (1 + distances_low[i, :, None]), axis=0)

# 座標の更新
learning_rate = 0.1
Y -= learning_rate * grad

今後のステップ

・ガウス分布に基づく距離計算。
・コスト計算に基づく勾配降下法にアルゴリズム。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?