More than 5 years have passed since last update.
データをシャッフルしてクラスタリングで元に戻すやつ Clustering Tips①
この記事は古川研究室 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を生成するっていうコードでした。似たような状況で人工データを作りたい方はつかってください。
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
