14

今天我試圖學習一些關於K-means的知識。我瞭解算法,我知道它是如何工作的。現在我正在尋找正確的k ...我發現手肘標準作爲一種方法來檢測正確的k,但我不明白如何使用scikit學習?!在scikit瞭解我正在聚類事情以這種方式Scikit學習-K-手段 - 彎頭 - 條件

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

所以我應該爲n_clusters = 1這樣做幾次... N和錯誤率看,以獲得正確的K +認爲這將是愚蠢的,會花費很多時間?!

回答

15

肘標準是一種視覺方法。我還沒有看到一個強大的數學定義。 但k-means也是一個非常粗糙的啓發式。

所以是的,你需要運行k-means與k=1...kmax,然後陰謀由此產生的SSQ和決定一個「最優」k。

存在k-means的高級版本,如X-means將以k=2開頭,然後增加它直到次要標準(AIC/BIC)不再提高。平分k-均值是一種也從k = 2開始的方法,然後重複分割羣集直到k = kmax。你可能可以從中提取臨時SSQ。無論哪種方式,我的印象是,在任何實際使用案例其中k-mean真的很好,你確實知道你事先需要的k。在這些情況下,k-means實際上不是一個「聚類」算法,而是一種算法vector quantization。例如。將圖像的顏色數量減少到k。 (通常你會選擇k爲例如32,因爲那是5位的顏色深度並且可以以壓縮的方式存儲)。或者例如在視覺詞袋方法中,您可以手動選擇詞彙大小。一個流行的價值似乎是k = 1000。然後你並不真正關心「簇」的質量,但重點是能夠將圖像縮減爲1000維稀疏矢量。 900維或1100維表示的性能不會有實質性差異。

對於實際的羣集任務,即當您想要手動分析產生的羣集時,人們通常使用比k-means更高級的方法。 K-means更像是一種數據簡化技術。

9

如果真實標籤未事先知道(如您的情況),那麼可以使用Silhouette係數評估模型(例如clustering)。

sklearn documentation

較高的剪影係數得分涉及具有更好的定義的簇的模型。每個樣本的輪廓係數被定義並且由兩個分數組成: '

a:樣本與同一類別中所有其他點之間的平均距離。

b:樣本與下一個 最近羣集中所有其他點之間的平均距離。

剪影係數被用於單個樣品然後被下式給出:

s=b-a/max(a,b)

現在,以找到最佳的kKMeans通過1..N爲n_clusters在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 = 6,輪廓係數NT是0.370380309351
對於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具有第二高的Silhouette係數值。

所以選擇n_clusters = 3是最佳的no。虹膜數據集的集羣。

選擇最優號碼。的集羣將取決於數據集的類型和我們試圖解決的問題。但大多數情況下,採用最高的輪廓係數會產生最佳數量的聚類。

希望它有幫助!

+1

但是在你的例子中,是不是n = 2的更高的輪廓係數? – mattdeak

+0

感謝@mattdeak指出。在這種情況下,選擇n = 3將是最好的,因爲虹膜數據集有三個物種,但同時也是輪廓coeff。並不是最高的。這看起來與較高的sillhouette coeff相矛盾。導致羣集的最佳數量。 您可以嘗試[gap static method](http://web.stanford.edu/~hastie/Papers/gap.pdf) –

+0

請優化n_cluster == 3。謝謝 – Yogesh