sklearn機器學習:K-Means初始質心怎麼放

重要參數init & random_state & n_init

在K-Means中有一個重要的環節,就是放置初始質心。

init

如果有足夠的時間,K-means一定會收斂,但Inertia可能收斂到局部最小值。是否能夠收斂到真正的最小值很大程度上取決於質心的初始化。init就
是用來幫助我們決定初始化方式的參數。

random_state

初始質心放置的位置不同,聚類的結果很可能也會不一樣,一個好的質心選擇可以讓K-Means避免更多的計算,讓算法收斂穩定且更快。在之前講解初始質心的放置時,我們是使用”隨機“的方法在樣本點中抽取k個樣本作爲初始質心,這種方法顯然不符合”穩定且更快“的需求。爲此,我們可以使用
random_state參數來控制每次生成的初始質心都在相同位置,甚至可以畫學習曲線來確定最優的random_state是哪個整數。

n_init

一個random_state對應一個質心隨機初始化的隨機數種子。如果不指定隨機數種子,則sklearn中的KMeans並不會只選擇一個隨機模式扔出結果,而會在每個隨機數種子下運行多次,並使用結果最好的一個隨機數種子來作爲初始質心。我們可以使用參數n_init來選擇,每個隨機數種子下運行的次數。這個參數不常用到,默認10次,如果我們希望運行的結果更加精確,可以增加這個參數n_init的值來增加每個隨機數種子下運行的次數。
然而這種方法依然是基於隨機性的。
爲了優化選擇初始質心的方法,2007年Arthur, David, and Sergei Vassilvitskii三人發表了論文“kmeans++:The advantages of careful seeding”,他們開發了”k-means ++“初始化方案,使得初始質心(通常)彼此遠離,以此來引導出比隨機初始化更可靠的結果。在sklearn中,我們使用參數**init =‘kmeans++’**來選擇使用k-means ++作爲質心初始化的方案。通常來說,建議保留默認的"kmeans++"的方法。

參數說明

**init:**可輸入"k-means++",“random"或者一個n維數組初始化質心的方法,默認"k-means++”。
輸入"k-means++":一種爲K均值聚類選擇初始聚類中心的聰明的辦法,以加速收斂;
如果輸入了n維數組,數組的形狀應該是(n_clusters,n_features)並給出初始質心;
random_state:控制每次質心隨機初始化的隨機數種子
n_init:整數,默認10
使用不同的質心隨機初始化的種子來運行k-means算法的次數。最終結果會是基於Inertia來計算的n_init次連續運行後的最佳輸出。
繼續用我們在博文《sklearn機器學習:K-Means》中建立的各向同性高斯團簇的數據點集

#init:默認"k-means++"
plus = KMeans(n_clusters = 10).fit(X)
plus.n_iter_
13
random = KMeans(n_clusters = 10,init="random",random_state=420).fit(X)
random.n_iter_
19

可見,k-means++可以加速收斂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章