1. 程式人生 > >聚類之K-means演算法

聚類之K-means演算法

  聚類是一種無監督學習,讓相似的作為一類,不相似的當然不能歸為一類.非常符合我們日常的認知行為.據悉,大多數聚類問題都是NP完全問題,即不存在能夠找到全域性最優解的有效解法.我們常常是將可能的聚類情況定義一個代價函式,問題就轉化為尋找一個代價最小的劃分,變成了一個優化問題了.目標函式是一個從輸入(X,d)和聚類方案C=(C1, C2, C3, …, Cn)對映到正實數的函式G.我們的目標即找到合適的C使得G((X, d), C)最小.

  本次要講的K-means演算法的目標函式為

G((X,d),(C1,C2,C3,...,Cn))=i=1kxCid(x,ui(Ci)2)
=
i=1k
xCi||xu(Ci)||2

  其中ui(Ci)=argminuCxCid(x,u)2=argminuCxCi||xu||2
  變數x表示集合X中的各個資料,變數u表示簇(簇指的是分出的類)的中心點,d(x, u)是x到簇中心u的歐式距離.
  即找到合適的C=(C1, C2, C3, …, Cn)使得所有簇中,找到的簇中心點到其簇中其餘點的和最小.我們根據需求已經確定需要有n個簇,如此一來找到了這n個簇的中心點,那麼對於原資料集的點或者新加入的點就可以通過計算該點到這n個簇中心點的歐式距離,最小的那個即是所歸屬的簇.

  該演算法的一個應用方向是根據已知資料集進行聚類劃分,從而判斷資料集中的點屬於哪一類,或者新來的一個點屬於哪一類.
比如我們以此方法將2017年上映的所有電影分為愛情類,動作類,科幻類三大類(可以考慮根據電影中的有多少”愛情鏡頭”,”動作鏡頭”,”科幻鏡頭”進行三變數或三維的聚類).

  另一個應用方向是在數字通訊中,將傳輸訊號集合記作X,X會是一個很龐大的資料集合.顯然某些場景下我們沒有必要也不可能將X中所有元素全部傳輸完成.我們可以用此方法將資料集進行聚類,用簇的中心點來代替簇中其他點,進行傳輸.此時,目標函式G即為失真程度.

  演算法解析:

  • 輸入:已知的全部資料,記為X;已知的聚類數目k.
  • 初始化:隨機初始化簇中心點:u1, u2, u3, …, uk.
  • 重複直到收斂(即u1, u2, u3, …, uk不再變化):將X中除去隨機選取的初始化k個簇中心u值,逐一依據歐氏距離分配到k個簇中.每次分配一個x,更新一次各個簇中心:ui=1nixCix,其中ni是第i個簇的元素個數.
  • 返回:u1, u2, u3, …, uk.

如此即得到了各個簇的中心點.

  該演算法的優點是簇內各個點距離緊密而各個簇之間聚類較遠,聚類效果較好.
  缺點是初始化步驟中,隨機初始化的簇中心點u1, u2, u3, …, uk對聚類結果影響很大.這是由於該演算法在幾輪迭代後會收斂於某個駐點,而我們很難判斷此駐點使得全域性最優(大多數聚類問題的通病,也是NP完全問題的弊病).
  傳統的解決方法為採取先驗知識(即”我們認為”,呵呵)人為選取初始簇中心;或者多次實驗,每次選擇不同的簇中心,最後找一個使得目標函式G(即代價)最小的初始簇中心.
  我們實驗室提出了依據Cfs演算法大致選擇初始簇中心,之後再進行K-means聚類.大大提高了準確度,而Cfs演算法耗時也不大.有興趣進一步交流的歡迎加我QQ:1127898216(請註明好友申請理由,謝謝).