2013-11-22 28 views
3

在每一個運行時下面的代碼給出不同的結果,同時聚類數據分成3份使用k均值方法:不穩定結果從scipy.cluster.kmeans

from numpy import array 
from scipy.cluster.vq import kmeans,vq 

data = array([1,1,1,1,1,1,3,3,3,3,3,3,7,7,7,7,7,7]) 
centroids = kmeans(data,3,100) #with 100 iterations 
print (centroids) 

三種可能的結果獲得的是:

(array([1, 3, 7]), 0.0) 
(array([3, 7, 1]), 0.0) 
(array([7, 3, 1]), 0.0) 

實際上,計算的k均值的順序是不同的。但是,分配哪個k個點屬於哪個簇不是不穩定嗎?任何想法??

回答

3

這是因爲如果傳遞的整數作爲k_or_guess參數,ķ初始質心從隨機選擇的一組輸入觀察值(這被稱爲Forgy method)。

the docs

k_or_guessint或ndarray

質心的數量來生成。每個質心分配一個 代碼,這也是生成的code_book矩陣中 質心的行索引。

通過從觀察 矩陣中隨機選擇觀察值來選擇最初的k個質心 。或者,通過N數組傳遞k指定初始質心。

嘗試交給它一個猜測來代替:

kmeans(data,np.array([1,3,7]),100) 

# (array([1, 3, 7]), 0.0) 
# (array([1, 3, 7]), 0.0) 
# (array([1, 3, 7]), 0.0) 
3

the docs

k_or_guess: int or ndarray 

質心的數量來生成。將代碼分配給每個質心,這也是生成的code_book矩陣中質心的行索引。

的初始k-質心通過隨機地選擇的觀測

所以所得簇的順序是隨機選擇的。如果你想與此更多的控制,可以指定

或者,通過N陣列AK通過指定初始k-重心

我不會reccomend後者一般情況下,作爲不同的起始簇[可以]導致不同的聚類,並且預定義的初始質心可能導致次優解。

在你所得聚類簡單情況下始終是相同的(最佳)模簇訂購:

>>> centroids, _ = kmeans(data,3,100) 
>>> idx, _ = vq(data, centroids) 
>>> centroids, idx 
array([1, 7, 3]), array([0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1]) 
>>> centroids, _ = kmeans(data,3,100) 
>>> idx, _ = vq(data, centroids) 
>>> centroids, idx 
array([3, 7, 1]), array([2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) 
+0

顯示所產生的集羣順序運行之間相同的是信息。謝謝! –