LoginSignup
9
1

More than 3 years have passed since last update.

データをシャッフルしてクラスタリングで元に戻すやつ Clustering Tips①

Last updated at Posted at 2019-07-22

この記事は古川研究室 Workout_calendar 8日目の記事です。

クラスタラベルで元データを並び替える

シャッフルされたデータをクラスタリングしてみると元に戻るんでしょうか。データにクラスタ構造があって、変なことしてなければ戻ります。動作検証に使えますね。
クラスタリングで得られるのはクラスタラベルです、np.argsort()を使って並び替えれば元に戻るかどうかを確認できます。並び替えはこんな感じですX[np.argsort(clustering.labels_)]
スクリーンショット 2019-07-22 23.48.55.png
元はこのようなデータでした。
スクリーンショット 2019-07-22 23.49.05.png

データの生成はこんな感じです。

# toy data poisson
lm=1.0
n_node=100
n_cluster=4
adj = np.random.poisson(lm, (n_node, n_node))
adj_max = np.max(adj)
n_menber = n_node // n_cluster
mod = n_node % n_cluster
for s in range(n_cluster):
  s = s * n_menber
  e = s + n_menber
  adj[s:e, s:e] = adj_max * 5
  if mod != 0:
    adj = adj[-mod:, -mod:] + np.ones((mod, mod))

X = np.random.permutation(adj)

k-meansでやってみましょう。adjがシャッフル前のデータ、Xがシャッフル後のデータです。

kmeans = KMeans(n_clusters=4, random_state=0)
kmeans_X = kmeans.fit(X)
sns.heatmap(X[np.argsort(kmeans_X.labels_)])

はい、元に戻りました。
スクリーンショット 2019-07-23 0.06.28.png

スペクトルクラスタリングでもやってみます。分解するんで正規化しておきます。
スクリーンショット 2019-07-23 0.22.37.png

adj_n = np.array([np.abs(v - np.mean(vec))/np.std(vec)  for vec in adj for v in vec]).reshape((100, 100))
X_n = np.random.permutation(adj_n)

sp_clustering = SpectralClustering(n_clusters=4, random_state=0)
sp_X = sp_clustering.fit(X_n)
sns.heatmap(X[np.argsort(sp_X.labels_)])

似たようなかんじですね、もどりました。
スクリーンショット 2019-07-23 0.23.32.png

コード

本記事は人工データつくるときに得られたTipsでした。ここでコードを共有してます。Colabなんですぐ動かせます。adjとあるように隣接行列からBoWを生成するっていうコードでした。似たような状況で人工データを作りたい方はつかってください。

9
1
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
9
1