【機械学習】K-meansを勉強してみる


K-meansクラスタリングとは?

K-means はクラスタリングに使われる教師なし学習方法です。
K個のクラスタに分類し、平均値を重心とするのでK-meansと呼ばれています。

K-Meansのアルゴリズム

1) ランダムに1~k個のデータポイントをクラスタの重心$\mu_i$として選ぶ。
2) 残りの全てのデータポイントを1で選んだ一番近いクラスタに割り振る。
3) 各クラスタで平均値を計算し、$\mu_i$をアップデートする。
4) 2~3を重心の変更がなくなるまで繰り返す。

Kの決め方 (Elbow Method)

K-meansではクラスタの数 Kを指定する必要があります。Kが多すぎると過学習してしまったり、逆に少なすぎると、本来分けられるべきデータが同じクラスタに入ってしまう可能性もあります。そこで、最適なKを見つけるのにElbow methodという方法があります。

Elbow method では y軸に損失をとり、x軸にクラスタ数 K をとる下のようなグラフを描きます。この時、肘のように曲がっている部分に値するKを最適なクラスタ数とするので、Elbow Method と呼ばれています。

scikit learn で K-Means

パラメター

パラメター 概要 デフォルト
n_clusters クラスタの数 int 8
init 初期重心の設定 'k-means', 'random', データポイント 'K-means++'(速く収束させるように自動で選んでくれる)
n_init 何回重心を変えるか int 10
max_iter 繰り返しの回数 int 10
tol 収束の許容値 float 1e-4
precompute_distance 距離を行列か個々で計算するか 'auto', bool 'auto'
random_state 重心の初期値のランダム方法 int, RandomState instance None
n_jobs 各実行時の同時処理の数 int None

Pythonの実行例

Elbow Method


from sklearn import datasets
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans

iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target

from sklearn.cluster import KMeans
wcss = []

for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)


plt.plot(range(1, 11), wcss)
plt.title('The elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS') 
plt.show()

丁度3ぐらいが肘にあたるので、K = 3で学習させる。

Predict


kmeans = KMeans(n_clusters = 3, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
y_kmeans = kmeans.fit_predict(X)

plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 100, c = 'red', label = 'Iris-setosa')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 100, c = 'blue', label = 'Iris-versicolour')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 100, c = 'green', label = 'Iris-virginica')

#Plotting the centroids of the clusters
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1], s = 100, c = 'yellow', label = 'Centroids')

plt.legend()

K-meansの利点と欠点

利点

  • シンプル。
  • 可視化しやすい。

欠点

  • スケールに依存しやすい。
  • 不均一で広範囲に散らばるデータには向いていない。