【機械学習、教師なし学習】K-meansでクラスタリングしてみる 〜scikit-learnを使って〜

K-meansアルゴリズムは教師なし学習のクラスタリングアルゴリズムです。

本記事では、K-meansの概要とscikit-learnを使って実装してみます。

K-meansの概要

K-meansは入力データの特徴によってクラスタリングする手法の1つです。

クラスタリングとは以下の図のようにデータを分類することを言います。

各データの正解データを入れずにクラスタリングできるので、教師なし学習に分類されます。

ちなみに上の図右の各データの塊をクラスタと言います。
K-meansではこのクラスタの中心位置を少しずつ調整していくことでクラスタリングをおこいます。

手順を箇条書きで書くと以下のようになります。

  1. 各クラスタ、各データの初期化(クラスタ数は先に指定)
  2. 各データの属するクラスタの更新
  3. 各クラスタの中心位置の更新
  4. ステップ2, 3を各クラスタの中心位置が変化しなくなるまで繰り返す

今回は手法の概要だけ説明しましたが、
手法としては非常にシンプルでわかりやすいです。

scikit-learnを使ってK-meansを試してみる

では、scikit-learnのK-meansアルゴリズムを使ってクラスタリングをしてみます。

必要なモジュールをimportしておきます。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import cluster

データの作成

まず、今回使うデータを作成します。
てきとうにランダムでデータを作り、プロットします。

datas = np.random.randn(nb_datas, 2)

x = datas[:, 0]
y = datas[:, 1]
plt.scatter(x, y)
plt.show()

クラスタリングするデータ

このデータをクラスタリングしていきます。

K-meansによってクラスタリング

K-meansによってクラスタリングをしていきます。

k-meansでは最初にクラスタ数(n_clusters)を定義する必要があります。
今回はとりあえず3つに分割してみようと思います。

では、K-means本体を作成し、fitメソッドで学習させます。

model = cluster.KMeans(n_clusters=3)
result = model.fit(datas)

学習はこれで終わりです。簡単ですね。

実行結果

では、結果を出力します。

まず、どのようにクラスタリングされたか見てみます。
各データに対するラベルはmodel.labels_に格納されています。
では、どのようにクラスタリングされたかを見てみます。

labels = result.labels_

# 各クラスタのデータの取得
data_l0 = datas[labels == 0]
data_l1 = datas[labels == 1]
data_l2 = datas[labels == 2]

# 各クラスタのデータのプロット
plt.cla()
x0, y0 = data_l0[:, 0], data_l0[:, 1]
plt.scatter(x0, y0, c="r")
x1, y1 = data_l1[:, 0], data_l1[:, 1]
plt.scatter(x1, y1, c="b")
x2, y2 = data_l2[:, 0], data_l2[:, 1]
plt.scatter(x2, y2, c="g")
plt.show()

ちなみに各クラスタの中心点はmodel.clustercenters\で確認することができます。

print(model.cluster_centers_)
#=>
#array([[ 1.1327299 , -0.10891025],
#       [-0.58071681, -0.87963784],
#       [-0.35248086,  0.94614312]])

ソースコードの全体像

import numpy as np
import matplotlib.pyplot as plt
from sklearn import cluster

datas = np.random.randn(nb_datas, 2)
x = datas[:, 0]
y = datas[:, 1]

model = cluster.KMeans(n_clusters=3)
result = model.fit(datas)

# 各クラスタのデータの取得
labels = result.labels_
data_l0 = datas[labels == 0]
data_l1 = datas[labels == 1]
data_l2 = datas[labels == 2]

# 各クラスタのデータのプロット
x0, y0 = data_l0[:, 0], data_l0[:, 1]
plt.scatter(x0, y0, c="r")
x1, y1 = data_l1[:, 0], data_l1[:, 1]
plt.scatter(x1, y1, c="b")
x2, y2 = data_l2[:, 0], data_l2[:, 1]
plt.scatter(x2, y2, c="g")

print(model.cluster_centers_)

終わりに

今回はK-meansをscikit-learnを使って試してみました。
非常に簡単にクラスタリングできるので便利でした。
次は実データを使ってクラスタリングしたいと思います。

参考文献

コメント

タイトルとURLをコピーしました