グルーピングする(教師なし学習と呼ばれている何か)

 

クラスタリング k-means法

欠損データを埋め合わせるためにも使える?

 

点がまばらに存在しているとき。

点の分布を「まとまり」で見ることができます。

一つ一つの点が「重さ」を持っているとして、「まとまり」の重心がもとまります。

 

ある点がどの「まとまり」に所属するかを、その重心との距離で計算してくれる。らしい。

データが「似ているもの」を集めてくれる、らしい。

 

 

 

コマンド

# k-means法を使うためのインポート
from sklearn.cluster import KMeans

# データ取得のためのインポート
from sklearn.datasets import make_blobs

# サンプルデータ生成
# 注意:make_blobsは2つの値を返すため、一方は使用しない「 _ 」で受け取る
X, _ = make_blobs(random_state=10)

# グラフを描画
# colorのオプションで色付けができる
plt.scatter(X[:,0],X[:,1],color='black')

# KMeansクラスの初期化 n_clustersはクラスターの数、initでKMeans以外のクラスターの作り方を指定できる。
kmeans = KMeans(init='random', n_clusters=3)

# クラスターの重心を計算
kmeans.fit(X)

# クラスター番号を予測
y_pred = kmeans.predict(X)


# concatでデータを横に結合(axis=1を指定)
merge_data = pd.concat([pd.DataFrame(X[:,0]), pd.DataFrame(X[:,1]), pd.DataFrame(y_pred)], axis=1)

# 上記のデータにて、X軸をfeature1、Y軸をfeature2、クラスター番号をclusterと列名指定
merge_data.columns = ['feature1','feature2','cluster']

# クラスタリング結果のグラフ化
ax = None
colors = ['blue', 'red', 'green']
for i, data in merge_data.groupby('cluster'):
    ax = data.plot.scatter(x='feature1', y='feature2', color=colors[i],
                                           label=f'cluster{i}', ax=ax)

これh

 

 

クラスターの数を的確に指定するには?

エルボー法という方法があるそうです。

k-meansの最適なクラスター数を調べる方法 - Qiita
背景お手軽なクラスタリング手段としてk-meansが有名であるが、以下の様な困ったポイントがあるk-means法の問題点の一つは、クラスタの個数kを指定しなければならないことだ。クラスタリング…
# エルボー方による推定。クラスター数を1から10に増やして、それぞれの距離の総和を求める
dist_list =[]
for i in range(1,10):
    kmeans= KMeans(n_clusters=i, init='random', random_state=0)
    kmeans.fit(X)
    dist_list.append(kmeans.inertia_)
    
# グラフを表示
plt.plot(range(1,10), dist_list,marker='+')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')

このコマンドの意味がよくわからないが、結果は出る。

「適切な分類」のためのシックハックをせざるをえないのだなぁと思う。

 

主成分分析

 

 

コメント