K-means聚類算法

K-means(K均值)是基於數據劃分的無監督聚類算法,也是數據挖掘領域的十大算法之一。

何爲聚類算法?在某種程度上可以理解爲無監督的分類方法。

聚類算法可以分爲哪些部分? 一般來說可以分爲基於劃分的方法、基於連通性的方法、基於密度的方法、基於概率分佈模型的方法等。K-means就是經典的基於劃分的聚類方法。

1、K-means的基本原理

對於基於劃分的這一類聚類算法而言,其方法是將樣本的矢量空間劃分爲多個區域Si|ki=1 ,每個區域都存在一個區域中心Ci|ki=1 ,這樣對於每一個樣本,都可以建立一種樣本到區域中心的映射q(x) :

q(x)=i=1k1(xSi)Ci

其中1()爲指示函數,即代表樣本x是否屬於區域S。

不同的基於劃分的聚類算法的主要區別就在於如何建立相應的映射方式q(x) 。在k-means中,映射是通過樣本與各中心之間的誤差平方和最小這一準則來建立的。

k-means算法的主要實現步驟有以下四步:

  1. 初始化聚類中心C(0)1 ,C(0)2 ,C(0)3 …,,C(0)k ,可選取前K個樣本或者隨機選取K個樣本;
  2. 分配各個樣本xj 到最相近的聚類集合,樣本分配依據爲:
    S(t)i={xjxjc(t)j22xjc(t)p22}
    式中i=1,2,…,k,pj
  3. 根據步驟2的分配結果,更新聚類中心:
    c(t+1)i=1|S(t)i|xjS(t)ixj
  4. 若迭代次數達到最大迭代步數或者前後兩次迭代的差小於設定閾值ε ,即c(t+1)ic(t)i22<ε ,則算法結束,否則重複步驟2。

2、k-means++

k-means對聚類中心的初始化比較敏感,不同的初始值會帶來不同的聚類結果,這是因爲k-means僅僅是對目標函求近似局部最優解,不能保證得到全局最優解,所以不同的初始聚類中心可能會導致不同的劃分結果,產生較大的偏差。

爲了解決(緩解)上面這種情況,有人提出了k-means++算法。k-means++與普通的k-means算法的區別在於初始化起始點的方法不同,k-means是從樣本中隨機的抽取K個作爲聚類的初始中心點,而k-means++算法選擇初始中心點要求初始的聚類中心之間的相互距離要儘可能的遠。
該算法的描述是如下:

  1. 從輸入的數據點集合中隨機選擇一個點作爲第一個聚類中心
  2. 對於數據集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x)
  3. 選擇一個新的數據點作爲新的聚類中心,選擇的原則是:D(x)較大的點,被選取作爲聚類中心的概率較大
  4. 重複2和3直到k個聚類中心被選出來
  5. 利用這k個初始的聚類中心來運行標準的k-means算法

從上面的算法描述可以看出,k-means++與k-means的主要區別在第三步,即在確定第一個隨機的聚類中心後,之後的聚類中心相互之間要儘可能的距離最遠,其實這樣也比較容易理解,聚類點比較分散時,能更加容易的劃分出正確的分類,如果初始點比較聚集,那分類的效果肯定不理想了。

3、Kernel K-means和Spectral Clustering

經典的k-means採取二次歐氏距離作爲相似性的度量,並且假設分類時的聚類誤差是服從正態分佈的,因此k-means在處理非標準正態分佈和非均勻樣本集合時聚類效果較差。

對於非標準正態分佈和非均勻分佈的樣本,k-means聚類效果不好,其主要原因是k-means是假設相似度可以用二次歐式距離等價的衡量,但是在實際的樣本集合中這個假設不一定實用。

爲了有效客服這個侷限性假設,k-means需要推廣到更廣義的度量空間。經典的兩種改進框架就是Kernel K-means和Spectral Clustering(譜聚類)。

Kernel k-means將樣本點xi 通過某種映射方式xiϕ(xi) ,映射到新的高維空間Φ ,在該空間中樣本點之間的內積可以通過對應的核函數進行計算,即:

k(xi,xj)=ϕ(xi)Tϕ(xj)
藉助核函數,可以在新的空間進行k-means聚類,而此時樣本之間的相似度取決於核函數的選擇。

Spectral Clustering算法嘗試着變換樣本的度量空間,首先求取樣本集合的仿射矩陣,然後計算仿射矩陣的特徵向量,利用得到的特徵向量進行k-means聚類。其實仿射矩陣隱含的重新定義了樣本點的相似性。

筆者並未在Kernel k-means和Spectral Clustering進行過多的學習,因此可說的不多,這裏給一篇講這兩種方法的文章:Kernel k-means, spectral clustering and normalized cuts

4、二分k-means聚類

按照k-means的聚類規則,其很容易就陷入局部最小值。爲了解決這一問題。有人提出了二分k-means聚類算法。其中心思想是:首先把所有樣本看成一個簇,而後二分這個簇,接着選擇其中一個簇繼續進行二分,直到選出了K個簇。至於選取哪個簇繼續二分,其選取的原則是二分這個簇後會使總的誤差平方和最小。這裏的誤差平方和可以理解爲各樣本到聚類中心點的距離和。

這裏的主要思想其實很好理解,假設這裏有三個類A、B、C,在上一次二分的時候,A和B因爲靠的比較近,被劃在了同一個簇X1 中,C被單獨的劃在一個簇X2 中,現在要決定在X1X2 選取哪個簇繼續二分,現在計算機會分別計算這兩個簇分別進行二分後的誤差的平方和,結果發現在選取X1 繼續進行二分時,其誤差的平方和比選取X2 二分要小,因此決定選取簇X1 進行二分。
這裏寫圖片描述
爲方便解釋,筆者繪製了上面這三幅圖,繪圖水平較差,大家湊合看。
圖a中,上一次的二分,將這個樣本集分爲兩個新的簇,左邊A和B一起構成了簇X1 ,C構成了簇X2 ,圖中的黑色圓圈包圍的是當前簇的聚類中心。
圖b中,選取了簇X1 爲需要二分的簇,二分的結果看起來很好,計算誤差的平方和爲(2+1+2+1+1+2+1+2)*3=36
圖c中,選取了簇X2 爲需要二分的簇,分出了圖中所示的三個簇,明顯可以看出分類效果不好,計算誤差的平方和也會發現其值明顯大於圖b中的值。

參考資料:

  1. 視覺機器學習20講(最近剛出的書,寫的很好)
  2. 機器學習算法與Python實踐之(六)二分k均值聚類
  3. k-means++算法
  4. kernel k-means && Spectral Clustering

    我會在後面的博客貼出代碼,敬請關注!

發佈了65 篇原創文章 · 獲贊 366 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章