天天看點

《機器學習實戰》kMeans算法(K均值聚類算法)

============================================================================================

《機器學習實戰》系列部落格是部落客閱讀《機器學習實戰》這本書的筆記,包含對其中算法的了解和算法的Python代碼實作

另外部落客這裡有機器學習實戰這本書的所有算法源代碼和算法所用到的源檔案,有需要的留言

        機器學習中有兩類的大問題,一個是分類,一個是聚類。分類是根據一些給定的已知類别标号的樣本,訓練某種學習機器,使它能夠對未知類别的樣本進行分類。這屬于supervised learning(監督學習)。而聚類指事先并不知道任何樣本的類别标号,希望通過某種算法來把一組未知類别的樣本劃分成若幹類别,這在機器學習中被稱作 unsupervised learning (無監督學習)。在本文中,我們關注其中一個比較簡單的聚類算法:k-means算法。 

        k-means算法是一種很常見的聚類算法,它的基本思想是:通過疊代尋找k個聚類的一種劃分方案,使得用這k個聚類的均值來代表相應各類樣本時所得的總體誤差最小。

其Python實作的代碼如下:

  k-means算法比較簡單,但也有幾個比較大的缺點:

1)k值的選擇是使用者指定的,不同的k得到的結果會有挺大的不同,如下圖所示,左邊是k=3的結果,這個就太稀疏了,藍色的那個簇其實是可以再劃分成兩個簇的。而右圖是k=5的結果,可以看到紅色菱形和藍色菱形這兩個簇應該是可以合并成一個簇的:

《機器學習實戰》kMeans算法(K均值聚類算法)

2)對k個初始質心的選擇比較敏感,容易陷入局部最小值。例如,我們上面的算法運作的時候,有可能會得到不同的結果,如下面這兩種情況。K-means也是收斂了,隻是收斂到了局部最小值:

《機器學習實戰》kMeans算法(K均值聚類算法)

3)存在局限性,如下面這種非球狀的資料分布就搞不定了

《機器學習實戰》kMeans算法(K均值聚類算法)

4)資料庫比較大的時候,收斂會比較慢.

  K均值聚類中簇的值k是使用者預先定義的一個參數,那麼使用者如何才能知道k的選擇是否正确?如何才能知道生成的簇比較好?在計算的過程中保留了每個點的誤差,即該點到簇質心的距離平方值,下面将讨論利用該誤差來評價聚類品質好壞的方法,引入度量聚類效果的名額SSE(sum of squared Error,誤差平方和),SSE值越小,越接近于他們的質心,聚類效果也越好,有一種可以肯定減小SSE值得方法是增加k的數目,但這個違背了聚類的目标,聚類的目标是在保持簇數目不變的情況下提高簇的品質。