KMeans、MiniBatch-Kmeans(クラスタ分析)【Pythonとscikit-learnで機械学習:第9回】

データをクラスタリング解析する教師なし学習手法のKMeansを、実装・解説します。

本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。

各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。

本記事ではKMeansとMiniBatchKMeansを実装します。

以下のscikit-learnマップの黒矢印に対応します。

[scikit-learnのマップ]

KMeans, MiniBatch-KMeansの実装

本記事では、3つの異なる品種のブドウから作られたワインのプロリンの量と色から分類する課題に取り組みます。

本来はワインがどのブドウから作られたかという教師データがありますが、教師データは知らないものとして3つに分類します。

まずは実装コードと結果をご覧ください。

上側が実際のラベリングで、下側がKMeansによってクラスタリングした結果です。

緑と黄色のごちゃっている部分は全部緑になってしまいましたが、概ね合っているように思えます。

赤い星は各クラスターの中心点です。

# 解説4:ミニバッチk-meansやk-meansを実施
#km=cluster.MiniBatchKMeans(n_clusters=3, batch_size=100)
km=cluster.KMeans(n_clusters=3)
z_km=km.fit(X_norm)

データ数が1万個よりも多い場合には、MiniBatchKMeansを使用することが推奨されています。

MiniBatchKMeansは、KMeansを、全データでなくbatch_size分のデータごとに更新する手法です。

ここで重要なのは、あらかじめクラスターの数を指定する必要があることです。

各クラスターの中心点の初期座標は、k-means++というアルゴリズムで自動生成されます。

KMeans, MiniBatchKMeansの心

正確な情報は以下をご覧ください。

scikit-learnのKMeansの解説ページ

scikit-learnのMiniBatchKMeansの解説ページ

KMeansは教師なし学習の一種です。

データを自動的にクラスターに分けます。

KMeansではまず適当に設定した数の点を用意します。

ここではランダムではなく、kmeans++というアルゴリズムで、離れた点が生まれるようにしています。

各データが「生成した点」のどれに最も近いかを求め、各データが所属するクラスを決めます。

距離(ユークリッド距離)を計算するので、データは正規化しておく必要があります。

次にクラス分けされたデータの重心を求めます。

そこを中心点(クラスタ・センターor セントロイドと呼ぶ)として、また各データがどの中心点に近いかを求め、再度各データをクラス分けします。

そしてクラス分けされたデータの重心を求めます。

以上を繰り返し、中心点が変化しなくなったときにクラスタリング終了とします。

KMeansの注意点

KMeansは簡単で分かりやすい手法でクラスタリングできます。

ですが、注意点が2つあります。

1点目は事前にクラス数が分かっている必要があるということです。

2点目はデータが中心点から等方的に分布していると仮定している点です。

そのため、横方向に伸びて分布しているような場合(今回のデータの黄色)は、誤って他のクラスに分類されてしまいます。

今回は、答え(教師データ)が分かっているデータセットで、教師なし学習(クラスター分析)を実施しましたが、実際は正しい答えは分からないので、以上の2点に気をつけてください。

以上、Pythonとscikit-learnで学ぶ機械学習入門|第9回:KMeans, MiniBatchKMeansでのクラスター分析でした。

次回は、Spectral clusteringについて解説します。

【目次】Python scikit-learnの機械学習アルゴリズムチートシートを全実装・解説
scikit-learnのアルゴリズムチートマップで紹介されている手法を、全て実装・解説してみました。 ...