1. 程式人生 > >聚類方法之k-mean演算法

聚類方法之k-mean演算法

演算法思想:

K-mean演算法又稱K均值演算法,屬於原型聚類中的一種基於距離度量的聚類演算法。其思想是:

1.隨機選取資料集中的k個初始點作為質心,遍歷整個資料集,對於每個樣本,將其歸類到距離其最近的質心所對應的簇。
2.接著計算每個簇的均值,作為當前簇的質心,重新步驟1的操作,直至迭代結束或簇均值的調整幅度小於指定的閾值。

演算法流程圖如下:
這裡寫圖片描述

按照西瓜書上的迭代過程,如下圖所示:

這裡寫圖片描述

從圖中可看出,由於選取點的隨機性,第一輪迭代後的效果並不理想,但經過多輪迭代簇質心的改變,聚類效果明顯好了很多。

演算法改進:

由於k值是使用者預先設定的一個引數,存在著太多的隨機性,將k值設定太低,則無法表現出樣本之間的差異,但如果把k值設定太高,則會“誇大”樣本間的差異性。那麼,怎麼評判k值的選擇是否合理,或者說,如何來評價聚類的效果呢?

我們可以用誤差平方和(SSE:sum of square error)來評價聚類的效果
誤差平方和表示的是簇中所有樣本點到其質心距離平方和,誤差平方和越小,表示資料點越接近於其質心,聚類效果也越好。

通過最小化誤差平方和的評價思想,我們有兩條思路來優化K-mean演算法。
1.增加簇(k)的個數
2.先將資料集分為m個簇(m小於k),然後將m個簇中較大的簇分為幾個小簇,直到簇值個數為k

顯然,第一種方法有為我們的聚類目標,這裡,主要講述第二種方法中比較具有代表性的方法—二分K均值演算法。

二分k均值演算法的主要思想是:
1.設定聚類目標—簇的個數k
2.將所有點看成一個簇,此時簇的個數m=1
3.while m < k :
for 每一個簇 i:
計算總誤差i.SSE1
在給定的簇上進行K均值聚類(k=2)
計算一分為二的簇的總誤差i.SSE2
選擇誤差最小min(i.SSE2)的簇進行k均值聚類(k=2)

借用《機器學習實戰》的效果圖,二分K均值的效果圖如下:
這裡寫圖片描述

二分K均值演算法總能產生較好的聚類結果。

總結:

優點:

簡單易懂,容易實現

缺點:

1.k值的選擇比較盲目,一般根據實際情況來選擇
2.在大規模資料上演算法收斂過慢,且可能收斂到區域性最小而不是全域性最小。

參考

周志華:《機器學習》

Peter Harrington (作者) 李銳 , 李鵬 , 曲亞東 , 王斌 (譯):《機器學習實戰》