Pythonでtsneで次元圧縮したい(bhtsneを使う)

次元圧縮し、可視化することでクラスタリングがうまくいっているかを目で確認したいことがあります。今回は非線形な関係もとらえ、次元圧縮できる特徴があります。

コード

sklearnにもt-sneは実装されているが、あまりお勧めしないという情報が多かったので、bhtsneを用いる。

import bhtsne
bhtsne.tsne(data,dimensions=2)

主成分分析と比べてみる

ここではwineのデータを使ってみる。
PCAは線形結合した結果が本の値になるように、tsneは非線形での分解になる。

import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
wine = load_wine()

import bhtsne
tsne_res = bhtsne.tsne(wine.data,dimensions=2)

plt.scatter(tsne_res[:,0],tsne_res[:,1])

pca = PCA(n_components=2)
pca_res = pca.fit_transform(load_wine().data)

plt.scatter(pca_res[:,0],pca_res[:,1])
f:id:esu-ko:20200831204208p:plainf:id:esu-ko:20200831204220p:plain

tsneの方が2軸の関係がきれいな線になるように分解でき、PCAはそうならなかった。

クラスタリングしてみる

非線形な関係でのクラスタリングのDBSCANと相性が良いが、ひとまずkmeansで実施しました。

from sklearn.cluster import KMeans

km = KMeans(n_clusters=6)
km.fit(load_wine().data)

df = pd.DataFrame(
    {
        "d0":res[:,0],
        "d1":res[:,1],
        "cls":km.labels_
    }

)

for i in range(6):
  tmp = df[df['cls']==i]
  plt.scatter(tmp['d0'],tmp['d1'])

f:id:esu-ko:20200831204553p:plain 2軸の変化にともない、クラスタが分かれていくことが分かる。