50

今日、私はK-meansについて何かを学ぼうとしています。私はアルゴリズムを理解しており、それがどのように機能するかを知っています。今、私は右のkを探しています...右のkを検出する方法として肘の基準を見つけましたが、scikitの学習でそれを使用する方法がわかりません?! scikit Learnでは、この方法でクラスタリングしています

kmeans = KMeans(init='k-means++', n_clusters=n_clusters, n_init=10) 
kmeans.fit(data)

したがって、 n_clusters = 1...n に対してこれを数回実行し、エラー率を監視して正しい k を取得する必要がありますか? これは愚かで、多くの時間がかかると思いますか?!

4

3 に答える 3

80

(あなたの場合のように)真のラベルが事前にわからない場合は、K-Means clusteringエルボー基準またはシルエット係数のいずれかを使用して評価できます。

エルボー基準法:

エルボー法の背後にある考え方は、k の値の範囲 (num_clustersたとえば、k=1 から 10) に対して、指定されたデータセットで k-means クラスタリングを実行し、k の各値に対して、二乗誤差 (SSE) の合計を計算することです。

その後、k の値ごとに SSE の折れ線グラフをプロットします。折れ線グラフが腕のように見える場合 (下の折れ線グラフの赤い円 (角度のように))、腕の「肘」は最適な k (クラスターの数) の値です。ここでは、SSE を最小限に抑えたいと考えています。SSE は、k を増やすと 0 に向かって減少する傾向があります (k がデータセット内のデータ ポイントの数と等しい場合、SSE は 0 です。これは、各データ ポイントが独自のクラスターであり、データ ポイントとデータの中心との間に誤差がないためです)。そのクラスター)。

したがって、目標は、small value of kまだ SSE が低い a を選択することです。エルボーは、通常、k を増やすことによって収益が減少し始める場所を表します。

アイリスのデータセットを考えてみましょう。

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris['feature_names'])
#print(X)
data = X[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)']]

sse = {}
for k in range(1, 10):
    kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data)
    data["clusters"] = kmeans.labels_
    #print(data["clusters"])
    sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
plt.figure()
plt.plot(list(sse.keys()), list(sse.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")
plt.show()

上記のコードのプロット: ここに画像の説明を入力

プロットを見ると、3 が虹彩データセットの最適なクラスター数 (赤で囲まれた部分) であり、これは実際に正しいものです。



シルエット係数法:

sklearn のドキュメントから、

より高いシルエット係数スコアは、より適切に定義されたクラスターを持つモデルに関連しています。シルエット係数はサンプルごとに定義され、次の 2 つのスコアで構成されます。

a: サンプルと同じクラス内の他のすべてのポイントとの間の平均距離。

b: サンプルと次に近いクラスター内の他のすべてのポイントとの間の平均距離。

単一のサンプルに対するシルエット係数は、次のように与えられます。

kここで、 forの最適値を見つけるためにKMeans、 n_clusters の 1..n をループしKMeans、各サンプルのシルエット係数を計算します。

シルエット係数が高いほど、オブジェクトがそれ自体のクラスターとよく一致し、隣接するクラスターとの一致が不十分であることを示します。

from sklearn.metrics import silhouette_score
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

X = load_iris().data
y = load_iris().target
   
for n_cluster in range(2, 11):
    kmeans = KMeans(n_clusters=n_cluster).fit(X)
    label = kmeans.labels_
    sil_coeff = silhouette_score(X, label, metric='euclidean')
    print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))

出力 -

n_clusters=2 の場合、シルエット係数は 0.680813620271
n_clusters=3 の場合、シルエット係数は 0.552591944521
n_clusters=4 の場合、シルエット係数は 0.496992849949
n_clusters=5 の場合、
シルエット係数は 0.488517550854
n_clusters=7 の場合、シルエット係数は 0.356303270516
n_clusters=8 の場合、シルエット係数は 0.365164535737
n_clusters=9 の場合、シルエット係数は 0.346583642095
n_clusters=10 の場合、シルエット係数は 0.328266088778

ご覧のとおり、n_clusters=2のシルエット係数が最も高くなります。これは、2 が最適なクラスター数であることを意味しますね。

しかし、ここに問題があります。

アイリスのデータセットには 3 種類の花があり、最適なクラスター数の 2 と矛盾しています。したがって、n_clusters=2が最も高いシルエット係数を持っているにもかかわらず、 n_clusters=3を最適なクラスター数と見なします -

  1. アイリス データセットには 3 つの種があります。(最も重要な)
  2. n_clusters=2は、シルエット係数の 2 番目に高い値を持ちます。

したがって、n_clusters=3を選択するのが最適な数です。虹彩データセットのクラスターの。

最適な番号を選択します。クラスターの数は、データセットの種類と解決しようとしている問題によって異なります。しかし、ほとんどの場合、最高のシルエット係数を使用すると、最適な数のクラスターが得られます。

それが役に立てば幸い!

于 2017-01-07T20:10:04.847 に答える
36

肘の基準は視覚的な方法です。私はまだそれの確固たる数学的定義を見たことがありません. しかし、k-means もかなり大雑把なヒューリスティックです。

はい、k-means を で実行し、結果の SSQ をプロットして、「最適な」k を決定する必要がk=1...kmaxあります

X-means などの k-means の高度なバージョンが存在しk=2、2 次基準 (AIC/BIC) が改善されなくなるまでそれを増やします。k-means の二分法は、k=2 で開始し、k=kmax になるまでクラスターを繰り返し分割するアプローチです。おそらくそこから仮の SSQ を抽出できます。

いずれにせよ、k-mean が非常に優れている実際のユースケースでは、実際に必要な k を事前に知っているという印象があります。これらの場合、k-means は実際には「クラスタリング」アルゴリズムではなく、ベクトル量子化です。アルゴリズム。たとえば、画像の色数を k に減らします。(多くの場合、k を 32 などに選択します。これは、5 ビットの色深度であり、少し圧縮された方法で保存できるためです)。または、たとえば、語彙のサイズを手動で選択するバッグ オブ ビジュアル ワード アプローチなどです。一般的な値は k=1000 のようです。その後、「クラスター」の品質はあまり気にしませんが、主なポイントは、画像を 1000 次元のスパース ベクトルに縮小できるようにすることです。900 次元または 1100 次元の表現のパフォーマンスは実質的に変わりません。

実際のクラスタリング タスクの場合、つまり結果のクラスタを手動で分析する場合、人々は通常 k-means よりも高度な方法を使用します。K-means は、よりデータの単純化手法です。

于 2013-10-05T12:41:25.693 に答える