[scikit-learn] 11. k-means法によるクラスタリング

matplotlib

はじめに

scikit-learnのk-means法(KMeans)を使用したクラスタリング手法について解説します。この記事では、sklearn.datasets.make_blobsで生成したデータに対してクラスタリングを行う方法を学びます。

解説

モジュールのインポートなど

バージョン

データの生成

make_blobsを使用してデータを生成します。make_blobsの詳細については下記記事で解説しています。

[scikit-learn] 1. make_blobsによる分類用データの生成
scikit-learnのmake_blobs関数を使って分類モデルのテスト用データを簡単に作成する方法を解説します。クラスタの数、特徴量の次元数、データ点の分散などのパラメータを調整して、様々な分類問題に対応したデータセットを生成できます。

データの塊の数を5に設定し、データのばらつき(標準偏差)を示すcluster_stdパラメータを1、再現性のためのrandom_stateを10に指定しました。生成したデータを表示すると以下のようになります。

クラスター数

k-means法では自分でクラスター数を決める必要があります。ここでは、クラスター数を5と10に設定した場合の結果を示します。

KMeans(n_clusters)でモデルを設定します。設定したモデルに.fit(X)を適用することでクラスタリングを実行し、フィットした結果の.labels_属性からクラスターのラベルを取得できます。

結果の表示

cluster_centers_属性を使用することで、クラスタリング後に収束した各クラスタの重心座標を取得できます。

初期値

クラスターの中心の初期値はinitパラメータで変更できます。デフォルトは”k-means++”で、これにより適切な位置に初期値が設定されます。”random”を指定すると、ランダムに初期値が決定されます。n_initは初期値を設定する試行回数、max_iterは最適化計算の最大繰り返し回数です。ここでは両方とも1に設定して初期値の位置を確認します。

結果の表示

初期値がk-means++の場合、計算回数1回でも効果的なクラスタリングが実現できます。一方、randomオプションを使用すると初期値がランダムに設定されるため、1回の計算ではクラスタリング精度が低下することが明らかです。

収束の判断パラメータ tol

計算は誤差がtolの値を下回った時点で終了します。以下では、tol=0.1とtol=0.0001の場合のクラスタリング結果を比較します。

結果の表示

.n_iter_属性を使用することで計算の反復回数を確認できます。tolが0.0001の場合は6回、tolが0.1の場合は2回の計算で収束しています。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

k-means法は比較的シンプルながら強力なクラスタリング手法です。scikit-learnのKMeansクラスを使うことで、簡単に実装できることが分かりました。クラスタ数の決定にはエルボー法やシルエット分析が有効で、適切なパラメータ設定により精度の高いクラスタリングが可能です。

参考

KMeans
Gallery examples: Bisecting K-Means and Regular K-Means Performance Comparison Demonstration of k-means assumptions A de...
An example of K-Means++ initialization
An example to show the output of the sklearn.cluster.kmeans_plusplus function for generating initial seeds for clusterin...

コメント