web-dev-qa-db-ja.com

エルボー法と同等のスクレーンkmeans

最大10個のクラスターを調べているとしましょう。通常、scipyでは次のように「エルボ」プロットを生成します。

from scipy import cluster
cluster_array = [cluster.vq.kmeans(my_matrix, i) for i in range(1,10)]

pyplot.plot([var for (cent,var) in cluster_array])
pyplot.show()

それ以来、クラスタリングにsklearnを使用するようになりましたが、scipyの場合のようにプロットに必要な配列を作成する方法がわかりません。私の最高の推測は:

from sklearn.cluster import KMeans

km = [KMeans(n_clusters=i) for i range(1,10)]
cluster_array = [km[i].fit(my_matrix)]

残念ながら、無効なコマンドエラーが発生しました。これを行うための最高の方法は何ですか?

ありがとうございました

11
Arash Howaida

コードに構文上の問題がありました。今すぐ修正する必要があります。

_Ks = range(1, 10)
km = [KMeans(n_clusters=i) for i in Ks]
score = [km[i].fit(my_matrix).score(my_matrix) for i in range(len(km))]
_

fitメソッドは、単にselfオブジェクトを返します。元のコードのこの行

_cluster_array = [km[i].fit(my_matrix)]
_

_cluster_array_はkmと同じ内容になります。

scoreメソッドを使用して、クラスタリングの適合度の推定値を取得できます。各クラスターのスコアを表示するには、plot(Ks, score)を実行するだけです。

10
J. P. Petersen

kmeansクラスの慣性属性を使用できます。

Xがデータセットであると仮定します:

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

X = # <your_data>
distorsions = []
for k in range(2, 20):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    distorsions.append(kmeans.inertia_)

fig = plt.figure(figsize=(15, 5))
plt.plot(range(2, 20), distorsions)
plt.grid(True)
plt.title('Elbow curve')
20
Ahmed Besbes

また、クラスター中心距離を持つ各データ間のユークリッド距離を使用して、選択するクラスターの数を評価することもできます。以下にコード例を示します。

import numpy as np
from scipy.spatial.distance import cdist
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

iris = load_iris()
x = iris.data

res = list()
n_cluster = range(2,20)
for n in n_cluster:
    kmeans = KMeans(n_clusters=n)
    kmeans.fit(x)
    res.append(np.average(np.min(cdist(x, kmeans.cluster_centers_, 'euclidean'), axis=1)))

plt.plot(n_cluster, res)
plt.title('elbow curve')
plt.show()
4
lugq