Help us understand the problem. What is going on with this article?

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

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の利点と欠点

利点

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

欠点

  • スケールに依存しやすい。
  • 不均一で広範囲に散らばるデータには向いていない。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした