📖

【Python】クラスタリング(KMeans)でinitにndarrayを使って初期値を指定する方法

2022/05/06に公開

KMeansのinitに「k-means++」や「random」指定ではなく、ndarrayを指定する時に少しだけ困ったのでメモ(ちなみにinitはクラスタリングの際の初期中心点の指定に使います)。
「k-means++」や「random」を指定する記事は結構出てきたのですが、ndarrayを指定する方法は少なかったので、同じようなことをしたい人の助けになれば。
先に結果を言ってしまえば、ただ素直にndarrayで指定すればよかったのですが、私がnumpyに慣れていなかったので手こずっただけでした。
気になった点がありましたらコメントいただけましたら幸いです。

経緯

model.labels_ でグループを確認した際に、グループの番号順序を並べたいと思ったのがきっかけです。
例えば、何も手を加えないと
[1 1 1 0 0 0 0 2 2 2 2 2 2 2]
となるグループ分けを
[0 0 0 1 1 1 1 2 2 2 2 2 2 2]
として出力させたいということです。
ある程度どのようなグループができるか想定できている際に使用できると思います。
『30人のクラスで、得点の「上位グループ」と「中位グループ」と「下位グループ」に何となく分けたい時』のような場合を想定しています。

指定方法

まずは指定方法の確認方法です(ここがメモの肝)。
【事前確認】
事前確認として、一度initを指定せずにmodelを作成してfitして、どのような形で指定すればよいか確認すると指定しやすいかと思います。

model = cluster.KMeans(n_clusters=3)
model.fit(data)
print(predict.cluster_centers_)

【ndarrayの指定】
あとは出力結果を真似て値を指定すればよいです。

# 初期中心点を定義
init_centers = np.array([
       [1, 100],
       [15, 50],
       [30, 1]])

model = cluster.KMeans(n_clusters=3, init=init_centers)
model.fit(data)

参考

Discussion