PyInv

プログラミングのメモ、海外投資のメモ

Unsupervised Learning: Clustering (K-means)の流れ

Clustering (K-means)を1からやってみる

流れ

  • 準備:Sample Dataの作成
  • Sample Dataをグラフ化してクラスター数の目途をつける
  • エルボー法で最適なクラスター数を決定する
  • K-meansによる結果の確認



Sample Dataの作成

make_blobs関数で生成。シードは適当。

import sklearn.datasets import make_blobs
data, _ =make_blobs(random_state=5) #make_blobsは2つの値を返すため、一方は'_'で受け取っておいた
data[:5] 
f:id:singapp:20200915130859p:plain
ちょっとDataをみてみる


Sample Dataの可視化

散布図でデータがどんな塩梅かみてみる

import matplotlib.pyplot as plt
import matplotlib as mpl

plt.scatter(data[:,0], data[:,1], color ='blue)
plt.show()



ぱっと見でクラスターは2ぐらい(なんと面白くないものが生成されたのか。。。)
f:id:singapp:20200915131455p:plain

エルボー法でクラスター数を決める

データの可視化で検討を付けたクラスター数近傍に対して、エルボー法で実際の集合具合を計算する。
減少幅が低下する直前が理想的なクラスター数。

from sklearn.cluster import KMeans

dist_list=[]
for i in range(1,10):  #'2'を含む前後の結果をみたい
    km = KMeans(n_clusters=i, random_state=0, init='random') #init='random'でK-meansにしてある。これを取り除くとK-means++
    km.fit(data)
    dist_list.append(km.inertia_)

plt.figure(figsize=(10,6))
plt.plot(range(1,10), dist_list, marker='+')
plt.show()



結果は予想通り、クラスター数2より大きくなると勾配が緩やかになる。つまりクラスター数2が最適。
f:id:singapp:20200915132809p:plain

最適なクラスター数を使った結果の確認

クラスター数2の結果を確認する

mearge_data=[]
km = KMeans(n_clusters=2, random_state=0, init='random')
km.fit(data)
y_pred = km.predict(data)
mearge_data = pd.concat([pd.DataFrame(data[:,0]), pd.DataFrame(data[:,1]),pd.DataFrame(y_pred)],axis=1)
mearge_data.columns = ['feature1', 'feature2', 'cluster']

ax=None
colors = ['blue', 'green']
for i, dd in mearge_data.groupby('cluster'):
    ax=dd.plot.scatter(x='feature1', y='feature2',ax=ax,color=colors[i], label=f'cluster{i}')

plt.show()

きれいにできました
f:id:singapp:20200915140154p:plain