k-meansとは

クラスタリング

今までの学習は、教師あり学習と呼ばれ正解ラベルがあるデータを分類するものでした。
今回は、教師なし学習のクラスタリングについて学習します。

まず初めにクラス分類とクラスタリングの違いを説明します。
クラス分類は「教師あり学習」で、クラスタリングは「教師なし学習」になります。

クラス分類では事前に決まっている分類を新しいデータに当てはめて考える手法で、クラスタリングは、データの中で似たものの集まりを見つける手法です。

クラスタリングとは、正解ラベルがないデータに対しいくつかのグループ(クラスタ)に分けるものです。
クラスタリングは、代表的な教師なし学習手法で、多変量のサンプルデータが大量にある場合や、どういった傾向のクラスタに分割できるかが不明な場合に、クラスタリングすることで、全体のサンプルの中でクラスタを分割することが出来る手法になります。
例として、顧客のセグメント化や遺伝子の発現パターンなどがあります。

K-meansとは

K-meansとは、クラスタリングのアルゴリズムの一種で実行速度が速く拡張性があるという特徴があります。
K-meansのKはクラスタの数を示すハイパーパラメータです。
Kは必ずデータの数より小さい値に設定します。
なぜ「Kがデータは数より少なく設定するのか」ですが、クラスの数<データ数として、分類をするためです。
決まった値がなく不明瞭ですが、様々な求める手法があります。

K-meansのアルゴリズム

K-meansは以下のステップにより学習を行います。
1.ランダムな位置にクラスタの重心(中心点)を定める

2.それぞれのクラスタの重心と各点の距離を計算

3.各点を一番近いクラスタに割り当てる

4.2と3を繰り返し、設定した回数繰り返すか、クラスタの変更がなくなったら終了
実際に、K-meansを行っている過程をみることができるサイトがあるので見てみましょう。
K-means 法を D3.js でビジュアライズしてみた

K-meansの問題点

K-meansの問題点として、初期値によって局所最適解に陥ることがあります。

この例だと、明らかに上下にクラスタリングできるにも関わらず、初期値が近い所にあるため適切なクラスタリングができていません。
解決策として、初期値を変えて何度も実行することがあげられます。

K-meansの実装例

はじめに、クラスタリングするためのデータを作成します。

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

x1 = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9])
x2 = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3])

#1次元目をx1,2次元目をx2とする行列を作成
x = np.c_[x1, x2]

#x軸とy軸の幅を設定する
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.title('data')
#散布図を作成
plt.scatter(x1, x2)
plt.show()

実行すると、図が出力されます。

今回はkを3にして学習していきます。

kmeans = KMeans(n_clusters=3)
kmeans_model = kmeans.fit(x)
print(kmeans_model.labels_)

パラメータのn_clustersはクラスタ数を示しています。
実行すると、それぞれのデータがどのクラスタに属しているか出力されます。

[0 0 0 0 2 2 2 2 2 1 1 1 1 1]

数値ではわかりづらいので可視化してみてみましょう。

# 色とマーカーの形を設定
colors = ['b','g','y']
markers = ['o','s','D']

for i, l in enumerate(kmeans_model.labels_):
    plt.plot(x1[i],x2[i], color=colors[l],marker=markers[l], ls='None')
    plt.xlim([0, 10])
    plt.ylim([0, 10])
plt.show()

以上のプログラムを実行すると、クラスタに分けられた図が出力されます。

クラスタリングがきれいに行われていることが分かります。

今回作成したプログラム

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


x1 = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9])
x2 = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3])

x = np.c_[x1, x2]
print(x)

plt.xlim([0, 10])
plt.ylim([0, 10])
plt.title('data')
plt.scatter(x1, x2)
plt.show()

kmeans = KMeans(n_clusters=3)
kmeans_model = kmeans.fit(x)
print(kmeans_model.labels_)


# 色とマーカーの形を設定
colors = ['b','g','y']
markers = ['o','s','D']

for i, l in enumerate(kmeans_model.labels_):
    plt.plot(x1[i],x2[i], color=colors[l],marker=markers[l], ls='None')
    plt.xlim([0, 10])
    plt.ylim([0, 10])
plt.show()

まとめ

今回は、教師なし学習のクラスタリングとその手法のK-meansを学習しました。
K-meansは設定したKの数にデータを分ける学習で、顧客のセグメント化などに使われます。

Pythonや統計を効率よく学ぶには?

Pythonや統計を効率よく学ぶには、普段からPythonや統計学を用いて業務をしている現役のデータサイエンティストに質問できる環境で学ぶことです。
質問し放題かつ、体系的に学べる動画コンテンツでデータ分析技術を学びたい方は、オンラインで好きな時間に勉強できるAI Academy Bootcampがオススメです。受講料も業界最安値の35,000円(6ヶ月間質問し放題+オリジナルの動画コンテンツ、テキストコンテンツの利用可能)なので、是非ご活用ください。