ここでは、 scikit-learn で k-means を実行してみる。
データセットは、以下で紹介している iris データセット を使用する。
パッケージの導入
このブログにある Python コードを実行するためのパッケージをインストールする。
pip install jupyter scikit-learn matplotlib scipy
実行環境は Jupyter Notebook を想定。実行方法は jupyter notebook
。
matplotlib の使い方は以下を参照。
k-means の実装
import matplotlib.pyplot as plt
from sklearn import cluster
from sklearn import datasets
# iris データセットをロード
iris = datasets.load_iris()
data = iris['data']
# k-means モデルの作成
# クラスタ数は 3 を指定
model = cluster.KMeans(n_clusters=3)
model.fit(data)
# クラスタリング結果ラベルの取得
labels = model.labels_
# 以降、結果の描画
# 1 番目のキャンバスを作成
plt.figure(1)
# ラベル 0 の描画
ldata = data[labels == 0]
plt.scatter(ldata[:, 2], ldata[:, 3], color='green')
# ラベル 1 の描画
ldata = data[labels == 1]
plt.scatter(ldata[:, 2], ldata[:, 3], color='red')
# ラベル 2 の描画
ldata = data[labels == 2]
plt.scatter(ldata[:, 2], ldata[:, 3], color='blue')
# x軸、y軸の設定
plt.xlabel(iris['feature_names'][2])
plt.ylabel(iris['feature_names'][3])
plt.show()
model の各項目は以下の通り。
cluster_centers_
- クラスタの中心座標
labels_
- 各点に付与されたラベル、つまり、クラスタリングの結果
inertia_
- 各点からそれぞれが属するクラスタの中心までの距離の挿話
その他のクラスタリング手法
階層的凝集型クラスタリング
model = cluster.AgglomerativeClustering(n_clusters=3, linkage='ward')
非階層的クラスタリング Affinity propagation
model = cluster.AffinityPropagation()
おすすめ書籍
リンク
リンク