K-means均值聚類

算法步驟

算法很簡單一共4步:

1)隨機在圖中取K個種子點。
2)然后對圖中的所有點求到這K個種子點的距離,假如點Pi離種子點Si最近,那么Pi屬于Si點群。(上圖中,我們可以看到A,B屬于上面的種子點,C,D,E屬于下面中部的種子點)
3)接下來,我們要移動種子點到屬于他的“點群”的中心。(見圖上的第三步)
4)然后重復第2)和第3)步,直到,種子點沒有移動(我們可以看到圖中的第四步上面的種子點聚合了A,B,C,下面的種子點聚合了D,E)。

這個算法很簡單,但是有些細節我要提一下,求距離的公式我不說了,大家有初中畢業水平的人都應該知道怎么算的。我重點想說一下“求點群中心的算法”。

k-means算法的缺點:

1)K的值需要人工指定,這個K值的選定是非常難以估計的。很多時候,事先并不知道給定的數據集應該分成多少個類別才最合適。只能不斷試驗不同的K。
2)K-Means算法需要用初始隨機種子點來搞,這個隨機種子點太重要,不同的隨機種子點會有得到完全不同的結果。(K-Means++算法可以用來解決這個問題,其可以有效地選擇初始點)。

K-means++算法

這個算法只是解決了第二個缺點, k-means++算法選擇初始seeds的基本思想就是:初始的聚類中心之間的相互距離要盡可能的遠。具體算法如下:
1)先從我們的數據庫隨機挑一個隨機點當“種子點”。
2)對于每個點,我們都計算其和最近的一個“種子點”的距離D(x)并保存在一個數組里,然后把這些距離加起來得到Sum(D(x))。
3)然后,再取一個隨機值,用權重的方式來取計算下一個“種子點”。這個算法的實現是,先取一個能落在Sum(D(x))中的隨機值Random,然后用Random -= D(x),直到其<=0,此時的點就是下一個“種子點”。
4)重復第(2)和第(3)步直到所有的K個種子點都被選出來。
5)進行K-Means算法。

K-means和K-means++的實現(matlab)

k-means和k-means++:https://github.com/WZFish/K-means.git

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容