kMeans,Mean Shift クラスタリング(Python, Google Colaboratory を使用)

1. エグゼクティブサマリー

本記事では,Python と Google Colaboratory を使用して,kMeans クラスタリングおよび Mean Shift クラスタリングを実行する手順を示す.

クラスタリングとは,データの集合を類似性に基づいて複数のグループ(クラスタ)に分割する手法である.本記事では以下の2種類を扱う.

架空データ(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:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「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. ソースコード

架空データ

  1. 架空のデータの合成

    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)
    
  2. プロットして確認

    20 個のデータがプロットされている.

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.style.use('ggplot')
    plt.plot(a[:,0], a[:,1], 'ro')
    plt.show()
    
  3. kMeans クラスタリング

    このデータを使い,クラスタリングを行う. クラスタ数は 2 に設定.

    from sklearn.cluster import KMeans
    c = KMeans(n_clusters=2).fit_predict(a)
    print(c)
    
  4. kMeans クラスタリング結果の可視化

    クラスタリング結果を色分けした散布図で確認する.

    plt.scatter(a[:,0], a[:,1], c=c, cmap='viridis')
    plt.title('kMeans Clustering')
    plt.show()
    
  5. Mean Shift クラスタリング

    このデータを使い,クラスタリングを行う.

    from sklearn.cluster import MeanShift
    c = MeanShift().fit_predict(a)
    print(c)
    

Iris データセット

ここでは,Iris データセットをクラスタリングする.

  1. Iris データセットの読み込み
    import pandas as pd
    import seaborn as sns
    sns.set()
    iris = sns.load_dataset('iris')
    
  2. Iris データセットの表示
    print(iris)
    
  3. 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)
    

    (以下省略)
  4. 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)
    
  5. 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()
    
  6. 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 関数でクラスタラベルに基づく色分けを行う.