Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@shuva

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

More than 1 year has passed since last update.

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

利点

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

欠点

  • スケールに依存しやすい。
  • 不均一で広範囲に散らばるデータには向いていない。
3
Help us understand the problem. What is going on with this article?
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
shuva
情報理工学科の学部生です。覚書として色々投稿しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?