「k個の重心にデータを振り分けて、重心を更新する」を繰り返す最も代表的なクラスタリング手法
K-Means法は、データをk個のグループに分割する最も代表的なクラスタリング手法です。 「k個の旗を立てて、各データを最寄りの旗のグループにする。次に旗をグループの真ん中に移動する。」これを繰り返すだけのシンプルなアルゴリズムです。
上のグラフでは、丸い点がデータ、十字マークが重心(旗)です。 「再生」ボタンを押すと、重心が移動しながらクラスタが安定していく過程をアニメーションで確認できます。破線は重心の移動軌跡です。
1957年にStuart Lloydが発案し、現在でもscikit-learn、Apache Spark、Google BigQuery MLなど主要なツールに標準搭載されている、最も広く使われるクラスタリング手法です。
K-Meansの結果は初期重心の配置で大きく変わります。 ランダム初期化では、重心が1箇所に偏ってしまうことがあり、その場合は本来のクラスタを見つけられずに収束してしまいます。 K-Means++は2006年にArthurとVassilvitskiiが提案した初期化方法で、この問題を解決します。
K-Means++はscikit-learn・Apache Spark・Rなど主要なライブラリでデフォルトに採用されています。 上のツールで「ランダム」と「K-Means++」を切り替え、SSEの安定性と収束回数の違いを確認してみてください。
| 観点 | K-Means | 階層型 |
|---|---|---|
| kの指定 | 必要(事前に決める) | 不要(後から決められる) |
| 計算量 | O(n·k·t) — 高速 | O(n³) — 大規模データに不向き |
| 結果の再現性 | 初期値依存(毎回異なる可能性) | 決定的(毎回同じ結果) |
| クラスタ形状 | 球状(凸形状)のみ | リンケージ法により柔軟 |
| デンドログラム | なし | あり(階層構造を可視化) |
| 大規模データ | 数百万件でもOK | 数千件が限界 |
使い分けの目安:データが大きい・クラスタ数の目安がある → K-Means。 データが小さい・階層構造を見たい・kが不明 → 階層型。 両方試して結果を比較するのが実務では一般的です。