算法步驟
算法很簡單一共4步:
1)隨機在圖中取K個種子點示损。
2)然后對圖中的所有點求到這K個種子點的距離,假如點Pi離種子點Si最近嚷硫,那么Pi屬于Si點群检访。(上圖中,我們可以看到A论巍,B屬于上面的種子點烛谊,C,D嘉汰,E屬于下面中部的種子點)
3)接下來,我們要移動種子點到屬于他的“點群”的中心状勤。(見圖上的第三步)
4)然后重復第2)和第3)步鞋怀,直到,種子點沒有移動(我們可以看到圖中的第四步上面的種子點聚合了A持搜,B密似,C,下面的種子點聚合了D葫盼,E)残腌。
這個算法很簡單,但是有些細節(jié)我要提一下较幌,求距離的公式我不說了窥淆,大家有初中畢業(yè)水平的人都應該知道怎么算的。我重點想說一下“求點群中心的算法”巧娱。
k-means算法的缺點:
1)K的值需要人工指定闺金,這個K值的選定是非常難以估計的逾滥。很多時候,事先并不知道給定的數(shù)據(jù)集應該分成多少個類別才最合適败匹。只能不斷試驗不同的K寨昙。
2)K-Means算法需要用初始隨機種子點來搞,這個隨機種子點太重要掀亩,不同的隨機種子點會有得到完全不同的結果舔哪。(K-Means++算法可以用來解決這個問題,其可以有效地選擇初始點)槽棍。
K-means++算法
這個算法只是解決了第二個缺點捉蚤, k-means++算法選擇初始seeds的基本思想就是:初始的聚類中心之間的相互距離要盡可能的遠。具體算法如下:
1)先從我們的數(shù)據(jù)庫隨機挑一個隨機點當“種子點”刹泄。
2)對于每個點外里,我們都計算其和最近的一個“種子點”的距離D(x)并保存在一個數(shù)組里,然后把這些距離加起來得到Sum(D(x))特石。
3)然后盅蝗,再取一個隨機值,用權重的方式來取計算下一個“種子點”姆蘸。這個算法的實現(xiàn)是墩莫,先取一個能落在Sum(D(x))中的隨機值Random,然后用Random -= D(x)逞敷,直到其<=0狂秦,此時的點就是下一個“種子點”。
4)重復第(2)和第(3)步直到所有的K個種子點都被選出來推捐。
5)進行K-Means算法裂问。
K-means和K-means++的實現(xiàn)(matlab)
k-means和k-means++:https://github.com/WZFish/K-means.git