2024年10月13日Pythonの機械学習ライブラリであるsciki-learnのKMeansを使ってk-means法によるクラスタリングを行う方法を解説します。まとめk-means法によるクラスタリングk-means法とは、教師なし学習で代表的なクラスタリングの中でも有名な手法の一つです。分類アルゴリズムのk-近傍法とは異なるため注意しましょう。k-近傍法については「k近傍法(k-NN)を用いたデータ分類方法」で紹介していますのでもし興味あれば参考にしてください。k-means法のアルゴリズムの手順概要を説明すると以下のようになります。データの中からk個のデータ点を任意に抽出して、初期値のセントロイドとして設定する。3のステップを反復する。全てのデータ点を最も近いセントロイドにそれぞれ割り振る。各k個のセントロイドに割り振られたデータの重心を計算して、その重心を新しいセントロイドとして更新する。ここでセントロイドと言っているのは、各クラスタの中心の事です。Errors)というクラスタ内の誤差平方和を用いて、このSSEを最小化するようにセントロイドが選ばれていきます。k-means法は、クラスタ数を事前に指定しないとクラスタリングできないことも特徴です。k-means法によるクラスタリングは、Pythonの機械学習ライブラリであるscikit-learnにてKMeansとして実装がされています。本記事では、scikit-learnのKMeansを使ったクラスタリング方法の実装例を紹介します。クラスタ数を決める方法の一つであるエルボー法についても解説します。scikit-learnのKMeansを使ったk-means法によるクラスタリング方法k-menas法の使い方(sklearn.cluster.KMeans)実装例scikit-learnのmake_blogsでクラスタリング用のデータを用意し、KMeansを使ってk-means法によるクラスタリングする方法について紹介します。上記で紹介して実装例の各部分ごとに内容を解説していきます。KMeansk-meansクラスタリングを使用するには、sklearn.clusterからKMeansをインポートします。他にもnumpy等インポートしていますがそちらの説明は省略します。cluster_std=1.0)データは、make_blobsを使用して生成します。引数として指定しているのは以下のような項目です。今回は、5つのクラスタを作成しています。教師なし学習のため、labelの方は使用していません。乱数シードは、np.random.seedで設定していますが、make_blobsのrandom_state引数で指定することも可能です。km.fit_predict(data)上記の部分でk-meansクラスタリングを実行しています。n_clustersでクラスタ数を指定します。クラスタリングはfit_predictメソッドを使うことで実行することができます。{km.inertia_:.2f}")計算されたSSE(誤差平方和)については、inertia_を参照することで取得することができます。plt.show()上記の部分は、元データとクラスタリング結果を横に並べて表示している部分です。結果の図を再掲しますが、5クラスのデータに分類できていることが分かるかと思います。エルボー法によるクラスタ数の決定k-means法によるクラスタリングでは、実行前にクラスタ数を決めて指定する必要があります。上記の例では、方法の説明のために分かりやすいように5つのクラスタのデータセットを作り、そのデータセットに対してk=5でk-meansクラスタリングを実行したため、きれいにクラスタリングができていました。実際の適用場面では、データがいくつのクラスタになるかは事前に分かりません。kの数をどう決めればよいでしょうか。クラスタ数を決めるときに参考になる手法としてエルボー法という方法があります。エルボー法では、k-meansに指定するクラスタ数の数を増やしていったときにSSEがどのように変化するかをプロットし、その結果からクラスタ数を決定する方法です。クラスタ数を増やしていってSSEをプロットするとグラフが、かくっと曲がって変化が少なくなる部分が出てきます。エルボー法では、この時のクラスタ数を最適とします。「エルボー」というかというと、SSEのプロット形状が肘が曲がっているように見えることからだそうです。エルボー法でクラスタ数を調べてみるサンプルプログラムを見てみましょう。main()上記では、kを1~10まで変えつつ、KMeansを使ったk-meansクラスタリングを実行しています。図は各kにおけるSSEの値をリストに蓄積してグラフにプロットしたものになります。この結果を見るとクラスタ数が5のところまでは降下が大きいのに対して5以降については緩やかになっているように見えます。このため、kの適切な値は5ではないかと予想できます。これがエルボー法での考え方になります。今回は、分かりやすい分類データを使っているのできれいなプロット図になっていますが、現実的な問題に対しては、正直これほどきれいには分からない場合が多いのではないかと思います。まとめPythonの機械学習ライブラリであるsciki-learnのKMeansを使ってk-means法によるクラスタリングを行う方法を解説してきました。k-meansにて指定するクラスタ数を決める一つの方法であるエルボー法についても簡単にご紹介しています。k-means法は、教師なし学習で代表的なクラスタリングの中でも有名な手法の一つです。scikit-learnのKMeansの使い方も非常に簡単ですので、是非使い方を覚えてみてもらいたいと思います。Notesklearn.cluster.KMeansの公式ドキュメントはこちらを参照してください。ソースコード上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。Tech】Pythonプログラミングガイド本サイトで紹介しているPython入門、応用に関する記事のまとめページです。Python文法の入門から高度な内容、おすすめの書籍についても紹介しています。機械学習等のデータ分析やGUI開発、近年話題の生成AI等のトピックスについても含んでいます。某製造メーカーにてDX推進やシステムの設計・開発・導入をしているシステムエンジニアです。これまでの経験をもとにPythonプログラミング、機械学習などに関する技術情報について発信していきます。