2017-01-10 73 views
0

我想自動選擇k(k均值聚類),使用python中的scikit包(metrics.calinski_harabaz_score)中的calinski和harabasz驗證。通過所有集羣範圍使用k-means聚類時,我可以使用calinski和hrabasz驗證確定k嗎?

我環路選擇calinski_harabaz_score

for kClusterCnt in range(2, 21) : 
     value = metrics.calinski_harabaz_score(datasets.data, kmCls.labels_) 

的最大值是否有任何缺陷或錯誤,當我只用這種方法?

+0

你也可以擲骰子來選擇k。不要*依賴*這些措施,總是*手動驗證*您的羣集*。 –

+0

謝謝你的回覆。我知道我必須用平方和和其他方法來檢查聚類數。但是我需要製作一個程序,它自動選擇K並運行集羣,而無需人爲決定。所以我寫了一些問題來獲得一些建議。 – Bethlee

+0

不,不要*依靠平方和!自動聚類是一個矛盾。 –

回答

1

我認爲你需要調用適合每個簇號的kmeans。我將scikit learn documentation的示例與您的代碼合併如下。

from sklearn import metrics 
from sklearn.metrics import pairwise_distances 
from sklearn import datasets 
dataset = datasets.load_iris() 
X = dataset.data 
y = dataset.target 
import numpy as np 
from sklearn.cluster import KMeans 
kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X) 
labels = kmeans_model.labels_ 
metrics.calinski_harabaz_score(X, labels) 
for k in range(2, 21): 
    kmeans_model = KMeans(n_clusters=k, random_state=1).fit(X) 
    labels = kmeans_model.labels_ 
    labels = kmeans_model.labels_ 
    print k, metrics.calinski_harabaz_score(X, labels) 

輸出低於。

2 513.303843352 
3 560.399924247 
4 529.120719084 
5 494.094381914 
6 474.517429587 
7 448.871449442 
8 436.613024881 
9 414.530317405 
10 390.646480599 
11 368.89696343 
12 357.194592002 
13 342.732084105 
14 344.610818724 
15 337.809470535 
16 324.972019063 
17 322.825466107 
18 314.587220111 
19 306.64863559 
20 316.905301605 

根據這個結果,3個聚類中心是最好的。 「3 560.399924247」。

+0

謝謝你回答這個問題。是的,我製作了和你一樣的源代碼。但我不知道選擇k是有效的,並且沒有錯誤。 – Bethlee

+0

找到確切的k仍然是一個開放的研究問題。 calinski_harabaz_score是所提出的羣集適應方法之一。只有你可以說它對你的問題/數據集是否有效。 –

+0

始終對k-means進行多次隨機初始化。 –

1

請記住,由於初始化階段的隨機性,k-means是非確定性。這意味着您將得到一系列答案,並且您必須爲每個k值取樣該範圍,以便最適合該k值。這不是一蹴而就的。

+0

謝謝你回答這個問題。我試圖再次考慮。 – Bethlee

相關問題