http://www.cnblogs.com/LBSer/p/4605904.htmlhtml
Kmeans算法是一種非監督聚類算法,因爲原理簡單而在業界被普遍使用,通常在實踐中遇到聚類問題每每會優先使用Kmeans嘗試一把看看結果。本人在工做中對Kmeans有過屢次實踐,進行過用戶行爲聚類(MapReduce版本)、圖像聚類(MPI版本)等。然而在實踐中發現初始點選擇與聚類結果密切相關,若是初始點選取不當,聚類結果將不好。爲解決這一問題,本博文嘗試將模擬退火這一啓發式算法與Kmeans聚類相結合,實踐代表這種方法具備較好效果,已經在實際工做中推廣使用。算法
K-MEANS算法:輸入:聚類個數k,以及包含 n個數據對象的數據。輸出:知足方差最小標準的k個聚類。
處理流程:
(1) 從 n個數據對象選擇 k 個對象做爲初始聚類中心;
(2) 循環(3)到(4)直到每一個聚類再也不發生變化爲止
(3) 根據每一個聚類對象的均值(中心對象),計算每一個對象與這些中心對象的距離;並根據最小距離從新對相應對象進行劃分;
(4) 從新計算每一個(有變化)聚類的均值(中心對象)
K means的結果與初始點的選擇密切相關,每每陷於局部最優。大數據
下面以一個實際例子來說初始點的選擇對聚類結果的影響。首先3箇中心點(分別是紅綠藍三點)被隨機初始化,全部的數據點都尚未進行聚類,默認所有都標記爲紅色,以下圖所示:spa
迭代最終結果以下:3d
若是初始點爲以下:code
最終會收斂到這樣的結果:htm
那怎麼解決呢?通常在實際使用中,咱們會隨機初始化多批初始中心點,而後對不一樣批次的初始中心點進行聚類,運行完後選擇一個相對較優的結果。這種方法不只不夠自動,並且有較大機率得不到較優的結果。目前,研究較多的是將模擬退火、遺傳算法等啓發式算法與Kmeans聚類相結合,這樣能大大下降陷於局部最優的困境。下圖就是模擬退火的算法流程圖。對象
「紙上得來終覺淺,絕知此事要躬行」,僅知道原理而不去實踐永遠不能深入掌握某一知識。本人實現了基於模擬退火的Kmeans算法以及普通的Kmeans算法,以便進行比較分析。blog
1)首先咱們隨機生成二維數據點以便用於聚類。get
2)基於原生的Kmeans獲得的結果。
3)基於模擬退火的Kmeans獲得的結果
由上圖的實驗結果能夠看出,基於模擬退火的Kmeans所得的整體偏差準則結果爲:19309.9。
而普通的Kmeans所得的整體偏差準則結果爲:23678.8。
能夠看出基於模擬退火的Kmeans所得的結果較好,固然,此算法的複雜度較高,收斂所需的時間較長,尤爲是在大數據環境下。