KMeans
KMeans是一種無監督學習聚類方法, 目的是發現數據中數據對象之間的關係,將數據進行分組,組內的相似性越大,組間的差別越大,則聚類效果越好。
無監督學習,也就是沒有對應的標籤,只有數據記錄.通過KMeans聚類,可以將數據劃分成一個簇,進而發現數據之間的關係.
原理
KMeans算法是將數據聚類成k個簇,其中每個, 算法具體描述:
- 隨機選擇k個聚類質心點:;
- 重複下面過程直到收斂{
對於每一個數據i,計算其屬於的簇:
;
對於每個簇j,重新計算簇質心:
}
用語言描述來說,就是:隨機確定k個初始點作爲簇中心; 爲每個數據分配簇[計算每條數據和簇中心的相似度,分配到最相似的簇上];根據簇中的數據點對每個簇中心進行更新.反覆重複直到收斂爲止.
僞代碼:
創建k個點作爲起始質心;
當任意一個點的簇分配結果發生改變時:
對數據集中的每個數據點:
對每個質心:
計算質心和當前數據點的相似度
將數據點分配到最近的質心所代表的簇上
對於每個簇,計算簇中所有點的均值,並將均值作爲新的簇中心[質心]
存在問題及其處理方法
- 必須事先給出k(要生成的簇的數目),而且對初值敏感,對於不同的初始值,可能會導致不同結果。
- 不適合於發現非凸面形狀的簇或者大小差別很大的簇。
- 對於“躁聲”和孤立點數據是敏感的,因爲簇的中心是通過計算數據的平均值得到的,這些數據的存在會使聚類的中心發生很大的偏移;
- 容易陷入到局部最優解.
對於局部最優解的問題,一方面可以像決策樹一樣,對最後生成的聚類效果進行"剪枝"處理,但有所不同,因爲要保證簇數目不變,所有處理進行"剪枝處理"外,還需要"增枝處理",具體可以依據某種指標[SSE sum of square errors]選擇指標最大的簇嘗試劃分, 然後選擇兩個進行合併,保證簇的數目不變.
另一方面,可以對kmeans進行優化處理,存在一種二分kMeans處理.
二分k均值:首先將所有數據看成一個簇,然後將該簇一分爲二,之後選擇其中一個簇繼續劃分, 如何選擇簇取決於對其劃分是否可以最大程度的降低SSE的值;然後反覆重複,直到得到K個簇爲止.
代碼實現
github地址: repository