HOJI-CHAN’s diary

自己学習の備忘録

高次元データの次元削減


高次元データの可視化として次元削減手法もいろいろあるんだなということで、いくつか整理して違いを試してみようと思います。

実際に、pythonを使ってirisのデータで確認してみます。(Python3.5)

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
Y = iris.target


1)主成分分析(PCA)
・分散を最大にするように、軸を決めていく手法。(ざっくりすぎる説明)

import numpy as np
import matplotlib.pyplot as plt

cov_mat=np.cov(X.T)
eigen_vals,eigen_vecs = np.linalg.eig(cov_mat)
var_exp=[(i/sum(eigen_vals)) for i in sorted(eigen_vals, reverse=True)]
cum_var_exp=np.cumsum(var_exp)

eigen_pairs=[(np.abs(eigen_vals[i]),eigen_vecs[:,i]) for i in range(len(eigen_vals))]
eigen_pairs.sort(reverse=True)
w=np.hstack((eigen_pairs[0][1][:,np.newaxis],eigen_pairs[1][1][:,np.newaxis]))

X_pca=X.dot(w)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=Y, cmap=plt.cm.Paired)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.show()

グラフはこんな感じです。
f:id:HOJI-CHAN:20170830111110p:plain


2)t-SNE
参考:
t-distributed stochastic neighbor embedding - Wikipedia
http://jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf

・PCAと違い非線形に対応可。
・高次元での確率分布で見た距離と低次元での確率分布で見た距離が一致するように、決める。
・距離は、KL (カルバック・ライブラー)情報量で決定(いつも覚えられない。。)

SNEとt-SNEとの違い
・t-SNEは、低次元での確率分布を自由度1のt分布としている。(SNEは、正規分布
・SNEは条件付き確率を使用しているが、t-SNEは対称となるように修正している。(これにより、コスト関数がシンプルになるため計算しやすい)

from sklearn.manifold import TSNE
#
model = TSNE(n_components=2, perplexity=30, n_iter=500, random_state=1)
X = model.fit_transform(X)

plt.clf()
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
plt.xlabel('tsne1')
plt.ylabel('tsne2')
plt.show()

グラフはこんな感じです。
f:id:HOJI-CHAN:20170830110350p:plain
ちなみに、perplexity=50とするとこんな感じです。
f:id:HOJI-CHAN:20170830110357p:plain

いまいち。。。
パラメータperplexityの決め方や、その他の手法についてはまた後日。