一、原理
- 先確定簇的個數,K
- 假設每個簇都有一個中心點 centroid
- 將每個樣本點划分到距離它最近的中心點所屬的簇中
選擇K個點做為初始的中心點 while(1) { 將所有點分配個K個中心點形成K個簇 重新計算每個簇的中心點 if(簇的中心點不再改變) break; }
- 目標函數:定義為每個樣本與其簇中心點的距離的 平方和(theSum of Squared Error, SSE)
– μk 表示簇Ck 的中心點(或其它能代表Ck的點)
– 若xn被划分到簇Ck則rnk=1,否則rnk= 0
• 目標:找到簇的中心點μk及簇的划分rnk使得目標 函數SSE最小
- 初始中心點通常是隨機選取的(收斂后得到的是局部最優解)
不同的中心點會對聚類結果產生不同的影響:
1、
2、
此時你一定會有疑問:如何選取"較好的"初始中心點?
- 憑經驗選取代表點
- 將全部數據隨機分成c類,計算每類重心座位初始點
- 用“密度”法選擇代表點
- 將樣本隨機排序后使用前c個點作為代表點
- 從(c-1)聚類划分問題的解中產生c聚類划分問題的代表點
結論:若對數據不夠了解,可以直接選擇2和4方法
- 需要預先確定K
Q:如何選取K
SSE一般隨着K的增大而減小
A:emmm你多嘗試幾次吧,看看哪個合適。斜率改變最大的點比如k=2
總結:
簡單的來說,K-means就是假設有K個簇,然后通過上面找初始點的方法,找到K個初始點,將所有的數據分為K個簇,然后一直迭代,在所有的簇里面找到找到簇的中心點μk及簇的划分rnk使得目標函數SSE最小或者中心點不變之后,迭代完成。成功把數據分為K類。
預告:下一篇博文講K-means代碼實現