この記事は古川研究室 Workout_calendar 8日目の記事です。
#クラスタラベルで元データを並び替える
シャッフルされたデータをクラスタリングしてみると元に戻るんでしょうか。データにクラスタ構造があって、変なことしてなければ戻ります。動作検証に使えますね。
クラスタリングで得られるのはクラスタラベルです、np.argsort()
を使って並び替えれば元に戻るかどうかを確認できます。並び替えはこんな感じですX[np.argsort(clustering.labels_)]
元はこのようなデータでした。
データの生成はこんな感じです。
# 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_)])
スペクトルクラスタリングでもやってみます。分解するんで正規化しておきます。
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_)])
#コード
本記事は人工データつくるときに得られたTipsでした。ここでコードを共有してます。Colabなんですぐ動かせます。adjとあるように隣接行列からBoWを生成するっていうコードでした。似たような状況で人工データを作りたい方はつかってください。