基本的なクラスタリング法ですが、その内容を理解できていない為
https://ja.wikipedia.org/wiki/K%E5%B9%B3%E5%9D%87%E6%B3%95
wikipediaに記載されている通り
- N個のデータに対し、ランダムにK個のクラスタを割り振る
- 各クラスタの重心/中心を算出
- 各データ ~ 各クラスタ重心の距離を算出し、最も近いクラスタへ再割り振り
- 上記の再割り振りがなくなるまで、上記2 & 3を繰り返す
k-nearest (k近傍法)との違い
名前はk-meansに似ていますが、
k近傍法では、予め用意された点に最も近い距離に分類します。
次のurlが分かりやすいです。
http://qiita.com/NoriakiOshita/items/698056cb74819624461f
pythonでは scikit-learn の KMeans() で
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
install scikit-learn
依存moduleもあるので、pipでinstall
# /usr/local/bin/pip numy
# /usr/local/bin/pip scipy
# /usr/local/bin/pip pandas
# /usr/local/bin/pip scikit-learn
scikit-learn の KMeans() の使用例
http://blog.amedama.jp/entry/2017/03/19/160121
↑こちらの写経。
import numpy as np
from sklearn.cluster import KMeans
def main():
features = np.array([
[ 80, 85, 100 ],[ 96, 100, 100 ],[ 54, 83, 98 ],[ 80, 98, 98 ],
[ 90, 92, 91 ],[ 84, 78, 82 ],[ 79, 100, 96 ],[ 88, 92, 92 ],
[ 98, 73, 72 ],[ 75, 84, 85 ],[ 92, 100, 96 ],[ 96, 92, 90 ],
[ 99, 76, 91 ],[ 75, 82, 88 ],[ 90, 94, 94 ],[ 54, 84, 87 ],
[ 92, 89, 62 ],[ 88, 94, 97 ],[ 42, 99, 80 ],[ 70, 98, 70 ],
[ 94, 78, 83 ],[ 52, 73, 87 ],[ 94, 88, 72 ],[ 70, 73, 80 ],
[ 95, 84, 90 ],[ 95, 88, 84 ],[ 75, 97, 89 ],[ 49, 81, 86 ],
[ 83, 72, 80 ],[ 75, 73, 88 ],[ 79, 82, 76 ],[ 100, 77, 89 ],
[ 88, 63, 79 ],[ 100, 50, 86 ],[ 55, 96, 84 ],[ 92, 74, 77 ],
[ 97, 50, 73 ],
])
kmeans_model = KMeans(n_clusters=3, random_state=None).fit(features)
for label, feature in zip(kmeans_model.labels_, features):
print(label, feature, feature.sum())
if __name__ == '__main__':
main()
↑こう書くと、↓こう表示されます
$ ./kmeans_scikit_learn.py
(2, array([ 80, 85, 100]), 265)
(2, array([ 96, 100, 100]), 296)
(0, array([54, 83, 98]), 235)
(2, array([80, 98, 98]), 276)
(2, array([90, 92, 91]), 273)
(1, array([84, 78, 82]), 244)
(2, array([ 79, 100, 96]), 275)
(2, array([88, 92, 92]), 272)
(1, array([98, 73, 72]), 243)
(2, array([75, 84, 85]), 244)
(2, array([ 92, 100, 96]), 288)
(2, array([96, 92, 90]), 278)
(1, array([99, 76, 91]), 266)
(2, array([75, 82, 88]), 245)
(2, array([90, 94, 94]), 278)
(0, array([54, 84, 87]), 225)
(1, array([92, 89, 62]), 243)
(2, array([88, 94, 97]), 279)
(0, array([42, 99, 80]), 221)
(0, array([70, 98, 70]), 238)
(1, array([94, 78, 83]), 255)
(0, array([52, 73, 87]), 212)
(1, array([94, 88, 72]), 254)
(0, array([70, 73, 80]), 223)
(2, array([95, 84, 90]), 269)
(2, array([95, 88, 84]), 267)
(2, array([75, 97, 89]), 261)
(0, array([49, 81, 86]), 216)
(1, array([83, 72, 80]), 235)
(1, array([75, 73, 88]), 236)
(1, array([79, 82, 76]), 237)
(1, array([100, 77, 89]), 266)
(1, array([88, 63, 79]), 230)
(1, array([100, 50, 86]), 236)
(0, array([55, 96, 84]), 235)
(1, array([92, 74, 77]), 243)
(1, array([97, 50, 73]), 220)