LoginSignup
7
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-11

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

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

K-Meansのアルゴリズム

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

Screenshot 2020-02-11 at 21.33.59.png

Kの決め方 (Elbow Method)

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

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

Screenshot 2020-02-11 at 22.10.03.png

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()

download.png

丁度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()

download (1).png

K-meansの利点と欠点

利点

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

欠点

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5