Kmeansに関する豆知識①

こんにちは!EMです^^

最近トロントは晴れの日が多くなって、一歩一歩春に近づいています!

やっぱり暖かいと気分も晴れますね♪

 

それではさっそく、前回からのKMeansシリーズの続きとして
より深くKMeansを考察していく豆知識的な内容を学習していこうと思っています!

 

前回では、このような内容を話しておりました↓

 

machinelearningforbeginner.hatenablog.com

 

その続きの話を今回付け加えようと思います。

 

適合性を評価する方法

 

前回の内容の最後の適合は、かなりセンターがずれていて不自然でした。

KMeansモデルを適合する場合、実は裏で計算式が働いています。

各ポイントとそれに割り当てられたクラスター中心との間の
二乗距離の合計を最小化する狙いがあるのです。

公式をいうと、d個の特徴があり、xがデータポイントで
xは最も近いセンターである場合、xをクラスcに割り当てる事ができます。

そしてxとc、2つの間の距離は次のようになります。

 

f:id:tennisfashionista:20210310012221p:plain

 

その場合、適合の合計スコアは次の合計になります。

 

f:id:tennisfashionista:20210310012530p:plain

 

x 'は全てのデータポイント
c'はそれに割り当てられた(または1番近い)クラスターのセンターの事です。

目標は、この距離を最小化することです。

ただ、実際には距離を最小化するセンターを見つけることは非常に難しいです。

 それに伴い、いくつかの良さげな研究アプローチがあるので見てみましょう。

フィットの実際の距離スコアはinertia_変数に格納され
次のように慣性値を取得できます。

慣性…物体が常に現在の運動状態を保とうとする性質のこと



print('The fit score (inertia) is: %3.3f' % k_means_model.inertia_)
 
【outfit】
The fit score (inertia) is: 28.043
 
 

Data Scale

KMeansは距離ベースのモデルです。

その為、データの規模が大きな影響を与える可能性があります。

2点間の距離は次のとおりです。

 

f:id:tennisfashionista:20210311004139p:plain

i=1d(xiyi)2

私たちの機能が大きく異なった規模の場合、いくつかの機能の影響は取り除かれます。 その為、KMeansに渡す前にデータをスケーリングすることはよくあります。

 

 

Kを選ぶ方法(How to Pick K)

 

この章では、理想的なクラスターの数を見つける方法について説明します。

適切な数は非常に主観的に決まることが多いです。

いくつかのパターンを見てみましょう。

  1. カテゴリー従属変数があり、基礎となるクラスの数がわかるとしましょう。
    この場合、Kを適切に設定できます。
    例えば、がんに関するデータセットがある場合、2つのクラスである事が
    わかっているため、2つのクラスターに適合させることができます。

  2. データを所定の数のクラスに分割していきたいと思います。
    仮に小売のデータが手元にあり、分割したい場合は
    顧客を事前に決定された数のタイプに分割し、この数をKに使用できます。
  3. 慣性値を使用して、セクションをガイドする事ができます。

次の3つのクラスターデータを試してみましょう。

 

points_per_class = 20

mean = [5,5]
cov = [[1,0],[0,1]]
x_one = np.random.multivariate_normal(mean, cov, (points_per_class))

mean = [-5,-5]
cov = [[1,0],[0,1]]
x_two = np.random.multivariate_normal(mean, cov, (points_per_class))

mean = [4,-2.5]
cov = [[0.25,0],[0,0.25]]
x_three = np.random.multivariate_normal(mean, cov, (points_per_class))

X = np.concatenate((x_one,x_two,x_three,x_four),axis=0)
dist(x
そして、慣性値をプロットします。(これは少し時間がかかります...)
 
k_range = np.arange(1,20)

inertia_list = []

for k in k_range :
    
    #Specify the model
    k_means_model = KMeans(n_clusters = k)
    k_means_model.fit(X)
    
    inertia_list.append(k_means_model.inertia_)
    
plt.scatter(k_range,inertia_list)
plt.show()
 
f:id:tennisfashionista:20210312011521p:plain
 
 
この表では、すぐに点が急降下し、横ばいになりました。
 
最初のいくつかのポイントに焦点を当てると…
 
 
plt.scatter(np.arange(7),inertia_list[0:7])
 
 

f:id:tennisfashionista:20210312012111p:plain

 

 

3~4番目のドットの後で、値がかなり横ばいになっていると分かります。

これは、新しい重心が慣性をそれほど減少させていないことを意味します。

その為、クラスの理想的な数が3~4つであるといえでしょう。

 

 これはあまり科学的ではありませんが、的を得た予測になる可能性があります。

どのように線引きをするのか決めるのは、難しい作業です。

その為、さらなるデータの判断材料や調査を行う事が重要になるでしょう。

 

 

長くなりそうなので、今回はここまでにします!

次回もKmeansに関する豆知識を引き続き解説していきたいと思いますが

もし効率的にプロから学びたい!という方は、専門の学校やレッスンを受ける事を

おススメしています^^

 

 ↓↓

 
 
これは、実践のビジネスの場でデータを使えるように指導してくれる、社会人の為の講座です! 
ぜひサイトや無料説明会等で情報を見てみてくださいね^^
 
 
また詳しくは簡単にメリットデメリット等もまとめているので
よかったら下の記事も参考にしてください^^
 

 

machinelearningforbeginner.hatenablog.com

 

 

最後まで読んで頂き、ありがとうございました!

 
,c)