kMeans,Mean Shift クラスタリング(Python, Google Colaboratory を使用)
1. エグゼクティブサマリー
本記事では,Python と Google Colaboratory を使用して,kMeans クラスタリングおよび Mean Shift クラスタリングを実行する手順を示す.
クラスタリングとは,データの集合を類似性に基づいて複数のグループ(クラスタ)に分割する手法である.本記事では以下の2種類を扱う.
- kMeans クラスタリング:クラスタ数を事前に指定し,各データ点を最も近い重心のクラスタに割り当てる手法
- Mean Shift クラスタリング:クラスタ数を事前に指定せず,データの密度分布からクラスタを自動決定する手法
架空データ(2次元正規分布から生成した合成データ)と Iris データセットの2種類を対象に,それぞれ kMeans および Mean Shift クラスタリングを実行し,結果を確認する.scikit-learn の KMeans クラスおよび MeanShift クラスを使用する.
2. 前準備(必要ソフトウェアの入手)
ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。
Python 3.12 のインストール(Windows 上) [クリックして展開]
以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。
方法1:winget によるインストール
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
winget install --scope machine --id Python.Python.3.12 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_pip=1 Include_test=0 Include_launcher=1 InstallLauncherAllUsers=1"
--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。
方法2:インストーラーによるインストール
- Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
- ダウンロードしたインストーラーを実行する。
- 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから
pythonコマンドを実行できない。 - 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。
インストールの確認
コマンドプロンプトで以下を実行する。
python --version
バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。
AIエディタ Windsurf のインストール(Windows 上) [クリックして展開]
Pythonプログラムの編集・実行には、AIエディタの利用を推奨する。ここでは、Windsurfのインストールを説明する。Windsurf がインストール済みの場合、この手順は不要である。
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
winget install --scope machine --id Codeium.Windsurf -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/SP- /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /DIR=""C:\Program Files\Windsurf"" /MERGETASKS=!runcode,addtopath,associatewithfiles,!desktopicon"
powershell -Command "$env:Path=[System.Environment]::GetEnvironmentVariable('Path','Machine')+';'+[System.Environment]::GetEnvironmentVariable('Path','User'); windsurf --install-extension MS-CEINTL.vscode-language-pack-ja --force; windsurf --install-extension ms-python.python --force; windsurf --install-extension Codeium.windsurfPyright --force"
--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。
【関連する外部ページ】
Windsurf の公式ページ: https://windsurf.com/
必要なライブラリのインストール [クリックして展開]
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
Google Colaboratory を使用する場合,これらのライブラリはあらかじめインストールされているため,この手順は不要である.
pip install -U numpy matplotlib scikit-learn pandas seaborn
3. 実行のための準備とその確認手順(Windows 前提)
3.1 プログラムファイルの準備
本記事のプログラムは Google Colaboratory 上での実行を前提としている.Google Colaboratory を使用する場合は,ノートブックを新規作成し,第5章の各コードブロックをセルに貼り付けて順番に実行する.
Windows 上でローカル実行する場合は,第5章のソースコードをテキストエディタ(メモ帳等)に貼り付け,clustering.py として保存する(文字コード:UTF-8).その際,%matplotlib inline は Jupyter/Colab 専用のマジックコマンドであるため削除する.
3.2 実行コマンド
Google Colaboratory を使用する場合は,各セルの実行ボタン(▶)をクリックするか,Shift+Enter でセルを実行する.
Windows のコマンドプロンプトで実行する場合は,ファイルの保存先ディレクトリに移動し,以下を実行する.
python clustering.py
3.3 動作確認チェックリスト
| 確認項目 | 期待される結果 |
|---|---|
| 架空データの合成 | 20個(N1=10, N2=10)の2次元データが数値配列として表示される |
| 架空データのプロット | 20個のデータが赤丸で散布図にプロットされる |
| 架空データの kMeans クラスタリング | クラスタ数2で各データ点のクラスタラベル(0または1)が表示される |
| 架空データの kMeans 結果の可視化 | クラスタリング結果が色分けされた散布図として表示される |
| 架空データの Mean Shift クラスタリング | クラスタ数が自動決定され,各データ点のクラスタラベルが表示される |
| Iris データセットの読み込み・表示 | 150行5列のデータが表示される |
| Iris データセットの数値変換 | 種名が 0, 1, 2 に置き換えられた数値行列が表示される |
| Iris データの kMeans クラスタリング | クラスタ数3で各データ点のクラスタラベル(0, 1, 2)が表示される |
| Iris データの kMeans 結果の可視化 | sepal_length と sepal_width を軸とした色分け散布図が表示される |
| Iris データの Mean Shift クラスタリング | クラスタ数が自動決定され,各データ点のクラスタラベルが表示される |
4. 概要・使い方・実行上の注意
架空データ
架空のデータの合成を行う.N1, N2 はデータの個数.c1, c2 は平均.sd1, sd2 は標準偏差.2つの正規分布からそれぞれ10個ずつ,合計20個の2次元データを生成し,結合する.
生成したデータをプロットして確認する.20 個のデータがプロットされている.
kMeans クラスタリングでは,クラスタ数を 2 に設定し,scikit-learn の KMeans クラスの fit_predict メソッドで各データ点のクラスタラベルを取得する.結果は色分け散布図で確認できる.
Mean Shift クラスタリングでは,scikit-learn の MeanShift クラスを使用する.kMeans と異なり,クラスタ数の事前指定は不要である.
Iris データセット
Iris データセットをクラスタリングする.データの読み込みには seaborn の load_dataset 関数を使用する.
Iris データセットを数値の行列に変換する.文字列 'setosa','versicolor','virginica' は,0, 1, 2 に置き換える.
kMeans クラスタリングでは,0, 1, 2, 3 列目を使い,クラスタ数を 3 に設定する.結果は第0列(sepal_length)と第1列(sepal_width)を軸とした散布図で確認できる.
Mean Shift クラスタリングでは,同じく 0, 1, 2, 3 列目を使う.
5. ソースコード
架空データ
- 架空のデータの合成
N1, N2 はデータの個数.c1, c2 は平均.sd1, sd2 は標準偏差.
import numpy as np N1, N2 = 10, 10 c1, c2 = (0, 0), (3, 5) sd1, sd2 = 1, 1 a1 = np.column_stack([np.random.normal(c1[0], sd1, N1), np.random.normal(c1[1], sd1, N1)]) a2 = np.column_stack([np.random.normal(c2[0], sd2, N2), np.random.normal(c2[1], sd2, N2)]) a = np.concatenate([a1, a2]) print(a)
- プロットして確認
20 個のデータがプロットされている.
%matplotlib inline import matplotlib.pyplot as plt plt.style.use('ggplot') plt.plot(a[:,0], a[:,1], 'ro') plt.show()
- kMeans クラスタリング
このデータを使い,クラスタリングを行う. クラスタ数は 2 に設定.
from sklearn.cluster import KMeans c = KMeans(n_clusters=2).fit_predict(a) print(c)
- kMeans クラスタリング結果の可視化
クラスタリング結果を色分けした散布図で確認する.
plt.scatter(a[:,0], a[:,1], c=c, cmap='viridis') plt.title('kMeans Clustering') plt.show() - Mean Shift クラスタリング
このデータを使い,クラスタリングを行う.
from sklearn.cluster import MeanShift c = MeanShift().fit_predict(a) print(c)
Iris データセット
ここでは,Iris データセットをクラスタリングする.
- Iris データセットの読み込み
import pandas as pd import seaborn as sns sns.set() iris = sns.load_dataset('iris')
- Iris データセットの表示
print(iris)
- Iris データセットを,数値の行列に変換
文字列 'setosa','versicolor','virginica' は,0, 1, 2 に置き換え.
a = iris.values.copy() a[:,4] = iris['species'].map({'setosa':0, 'versicolor':1, 'virginica':2}).values print(a)
(以下省略) - kMeans クラスタリング
このデータの 0, 1, 2, 3 列目を使い,クラスタリングを行う. クラスタ数は 3 に設定.
x = a[:,(0, 1, 2, 3)] from sklearn.cluster import KMeans c = KMeans(n_clusters=3).fit_predict(x) print(c)
- kMeans クラスタリング結果の可視化
第0列(sepal_length)と第1列(sepal_width)を軸として,クラスタリング結果を散布図で確認する.
plt.scatter(x[:,0], x[:,1], c=c, cmap='viridis') plt.xlabel('sepal_length') plt.ylabel('sepal_width') plt.title('kMeans Clustering (Iris)') plt.show() - Mean Shift クラスタリング
このデータの 0, 1, 2, 3 列目を使い,クラスタリングを行う.
x = a[:,(0, 1, 2, 3)] from sklearn.cluster import MeanShift c = MeanShift().fit_predict(x) print(c)
6. まとめ
kMeans クラスタリング
クラスタ数を事前に指定してクラスタリングを行う手法である.scikit-learn の KMeans クラスを使用し,n_clusters でクラスタ数を設定する.fit_predict メソッドで各データ点のクラスタラベルを取得する.
Mean Shift クラスタリング
クラスタ数を事前に指定せずにクラスタリングを行う手法である.scikit-learn の MeanShift クラスを使用し,データの密度分布からクラスタ数が自動決定される.
架空データによる検証
2つの正規分布(平均 (0,0) と (3,5),標準偏差 1)からそれぞれ10個ずつ,合計20個の2次元データを合成し,クラスタリングの対象とした.結果は色分け散布図で確認できる.
Iris データセットによる検証
Iris データセットの4つの特徴量(0, 1, 2, 3 列目)を使い,kMeans(クラスタ数3)および Mean Shift でクラスタリングを行った.種名は数値(0, 1, 2)に置き換えて使用する.
クラスタリング結果の可視化
クラスタリング結果を色分け散布図で表示することで,各クラスタへのデータ点の割り当てを視覚的に確認できる.matplotlib の scatter 関数でクラスタラベルに基づく色分けを行う.