k-means和二分k-means算法

聚類算法是機器學習中的一類無監督學習方法,用於將無標籤的數據進行聚類劃分。最簡單的也最典型的一類算法就是KMeans算法。此處的K表示劃分成K個聚類。利用各個點到質心之間的距離的平方和作爲將節點劃分到不同類的標準。當然也可以採用其他的距離計算方法,不一定是歐式距離方法。

一、KMeans

此方法一般是在數據分析前期使用,選取適當的K,將數據聚類後,研究不同聚類下數據的特點。

算法原理:

(1)隨機選擇K箇中心點;

(2)在第j次迭代中,對於每個樣本點,選取最近的中心點,歸爲該類;

(3)更新中心點爲每類的均值;

(4)j < j-1,重複(2)(3)迭代更新,直到誤差小到某個值或者達到一定的迭代步數,誤差不變,也就是收斂爲止;

空間複雜度爲O(n),時間複雜度爲O(l*K*N),其中N爲樣本個數,K爲中心點個數,即聚類數,I爲迭代次數


爲什麼迭代後誤差逐漸減小:

SSE= 

對於 而言,求導後,當 時,SSE最小,對應第(3)步;

對於 而言,求導後,當  時,SSE最小,對應第(2)步。

因此KMeans迭代能使誤差逐漸減少直到不變

 

二、二分kmeans算法

上述kmeans算法還是存在一定的問題,即它對初始選取的k比較敏感,一旦k選取不合適就容易陷入局部最優解的怪圈中,而不是全局最優解,而接下來引入的二分kmeans算法就是用於解決此類問題的一個算法。一種用於度量聚類效果的指標是SSE(Sum of Squared Error,誤差平方和),對應clusterAssment矩陣的第一列之和。SSE值越小表示數據點越接近於它們的質心,聚類效果也越好。因爲對誤差取了平方,因此更加重視那些遠離中心的點。一種肯定可以降低SSE值的方法是增加簇的個數,但這違背了聚類的目標。聚類的目標是在保持簇數目不變的情況下提高簇的質量。
那麼如何對結果進行改進?你可以對生成的簇進行後處理,一種方法是將具有最大SSE值的簇劃分成兩個簇。具體實現時可以將最大簇包含的點過濾出來並在這些點上運行K-均值聚類算法,其中的K爲2。

有兩種可以量化的辦法:合併最近的質心,或者合併兩個使得SSE增幅最小的質心。第一種思路通過計算所有質心之間的距離,然後合併距離最近的兩個點來實現。第二種方法需要合併兩個簇然後計算總SSE值。必須在所有可能的兩個簇上重複上述處理過程,直到找到合併最佳的兩個簇爲止。接下來將討論利用上述簇劃分技術得到更好的聚類結果的方法。

二分kmeans算法僞代碼如下:

爲克服K-均值算法收斂於局部最小值的問題,有人提出了另一個稱爲二分K均值(bisectingK-means)的算法, 該算法首先將所有點作爲一個簇,然後將該簇一分爲二。之後選擇其中一個簇繼續進行劃分,選擇哪一個簇進行劃分取決於對其劃分是否可以最大程度降低SSE的值。上述基於SSE的劃分過程不斷重複,直到得到用戶指定的簇數目爲止。

二分K-均值算法的僞代碼形式如下:
將所有點看成一個簇
當簇數目小於k時
對於每一個簇
計算總誤差
在給定的簇上面進行K-均值聚類(k=2)
計算將該簇一分爲二之後的總誤差
選擇使得誤差最小的那個簇進行劃分操作

另一種做法是選擇SSE最大的簇進行劃分,直到簇數目達到用戶指定的數目爲止。這個做法聽起來並不難實現。下面就來看一下該算法的實際效果。

 

二分k-means算法

  二分k-means算法是分層聚類(Hierarchical clustering)的一種,分層聚類是聚類分析中常用的方法。
分層聚類的策略一般有兩種:

  • 聚合。這是一種自底向上的方法,每一個觀察者初始化本身爲一類,然後兩兩結合
  • 分裂。這是一種自頂向下的方法,所有觀察者初始化爲一類,然後遞歸地分裂它們

  二分k-means算法是分裂法的一種。

1 二分k-means的步驟

  二分k-means算法是k-means算法的改進算法,相比k-means算法,它有如下優點:

  • 二分k-means算法可以加速k-means算法的執行速度,因爲它的相似度計算少了
  • 能夠克服k-means收斂於局部最小的缺點

  二分k-means算法的一般流程如下所示:

  • (1)把所有數據初始化爲一個簇,將這個簇分爲兩個簇。

  • (2)選擇滿足條件的可以分解的簇。選擇條件綜合考慮簇的元素個數以及聚類代價(也就是誤差平方和SSE),誤差平方和的公式如下所示,其中w(i)

w(i)​表示權重值,y∗

  • y∗表示該簇所有點的平均值。

這裏寫圖片描述

  • (3)使用k-means算法將可分裂的簇分爲兩簇。

  • (4)一直重複(2)(3)步,直到滿足迭代結束條件。

  以上過程隱含着一個原則是:因爲聚類的誤差平方和能夠衡量聚類性能,該值越小表示數據點越接近於它們的質心,聚類效果就越好。
所以我們就需要對誤差平方和最大的簇進行再一次的劃分,因爲誤差平方和越大,表示該簇聚類越不好,越有可能是多個簇被當成一個簇了,所以我們首先需要對這個簇進行劃分。

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