k-means
演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演算法之一。
k-means
演算法的基本思想是:以空間中
k個點為中心進行聚類,對最靠近他們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。
假設要把樣本集分為
k個類別,演算法描述如下:(1
)適當選擇
k個類的初始中心,最初一般為隨機選取;(2
)在每次迭代中,對任意乙個樣本,分別求其到
k個中心的歐式距離,將該樣本歸到距離最短的中心所在的類;(3
)利用均值方法更新該
k個類的中心的值;(4
)對於所有的
k個聚類中心,重複(2)(
3),類的中心值的移動距離滿足一定條件時,則迭代結束,完成分類。
kmeans
聚類演算法原理簡單,效果也依賴於
k值和類中初始點的選擇。
kmeans
演算法相對比較簡單,本次演算法實現採用
c++語言,作為物件導向設計語言,為保證其良好的封裝性以及**重用性。軟體包含三個部分,即
kmeans.h
,kmeans.cpp
和main.cpp。在
kmeans.h
中,首先定義乙個類,
class kmeans
,由於本演算法實現需要對外部資料進行讀取和儲存,一次定義了乙個容器
vector
,其中資料型別為結構體
st_point
,包含三維點座標以及乙個
char
型的所屬類的
id。其次為函式的宣告。
圖4.1
程式基本機構與對應函式
在kmeans.cpp
中具體給出了不同功能的公有函式,如圖
_1中所示,函式比較細化,便於後期應用的擴充套件,比較具體是聚類函式:
cluster
,其中嚴格根據
kmeans
基本原理,聚類的相似度選用的是最簡單的歐式距離,而迭代的結束判定條件選用兩次中心值之間的偏差是否大於給定
dist_near_zero
值。具體參見程式源**。
本次演算法實驗採用資料為三維點雲資料,類似於實驗室中三維雷射掃瞄儀器所採得資料,形式上更為簡單,整齊有規律,在
cloudcompare
中顯示出來,如下圖:
圖4.2
資料原始圖
資料為三維座標系下的三個點雲集,分別為球體,園面以及正方體,而
test.txt
檔案中是一組三維的點集,是混亂的,聚類演算法要做的便是將其中分類儲存起來。很自然的,聚類中
k值選擇了3。
在軟體實現時,建立了乙個含有結構體型別的容器,對原始資料進行讀取。
typedef struct st_point
st_point(st_pointxyz &p, int id)
}st_point;
該資料結構型別中包含三維點資料以及所分類的
id,資料容器為
vector
。本節重點分析專案中
culster
聚類函式的具體**,由於
c++語言較適用於大型程式編寫,本演算法又相對簡單,因此未免冗長,具體完整程式見專案源程式。下面只分析
kmeans
原理中(2)(
3)步驟的程式實現。
如下面程式源**:
1原資料檔案bool
kmeans::cluster()219
}20m_grp_pntcloud[pnt_grp].push_back(st_point(mv_pntcloud[i].pnt, pnt_grp));21}
2223
//儲存上一次迭代的中心點
24for (size_t i = 0; i < mv_center.size(); ++i)
2528
29if (!updategroupcenter(m_grp_pntcloud, mv_center))
3033
if (!existcentershift(v_center, mv_center))
3437
for (int i = 0; i < m_k; ++i)
4041 } while (true
);42
43return
true
;44 }
test.txt
中的資料被分為三類,分別儲存在檔案
k_1,
k_2,
k_3中,我們對三個聚類後所得資料點雲進行顏色新增後顯示在
cloudcompare
上,得下面的顯示圖:
圖4.3 kmeans
聚類結果
上圖是在給定的初始三個聚類中心點為,,
的情況下得到的結果。這是比較理想的,再看下圖:
圖4.4
改變初始聚類中心後的結果
本結果對應的初始三個中心點為,,
,很明顯,資料聚類並不理想,這說明
k-means
演算法一定程度上初始聚類種子點,這個聚類種子點太重要,不同的隨機種子點會有得到完全不同的結果。
上面改動了初始點,下面給出當
k=4的聚類結果,分別取了兩組不同的初始點集:
圖4.5.1 k=4
聚類結果
圖4.5.2 k=4
聚類結果
由上述聚類結果可知,當
k增加時,選取聚類初始點合適,可以得到滿意的結果,如
5_1所示,與最初結果相比只是將球點雲聚類成了兩部分,而
5_2與
5_1相比結果很不理想,由顏色可以看出,圖中只有兩類,另外兩類是空的,說明
k值不當,初始值不當的情況下,聚類是會失敗的。
綜上實驗結果分析可以看出,
kmeans
聚類演算法是一類非常快捷的聚類演算法,效果也很明顯,區域性性較好,容易並行化,對大規模資料集很有意義。但比較依賴於
k值得選定與初始聚類中心點的選擇,所以該演算法比較適合有人工參與的較大型聚類場合。
工程原始碼:
kmeans聚類演算法 - 開源中國社群
K Means聚類演算法原理
k means演算法是無監督的聚類演算法,它實現起來比較簡單,聚類效果也不錯,因此應用很廣泛。k means演算法有大量的變體,本文就從最傳統的k means演算法講起,在其基礎上講述k means的優化變體方法。包括初始化優化k means 距離計算優化elkan k means演算法和大資料情況...
K Means聚類演算法原理
k means演算法是無監督的聚類演算法,它實現起來比較簡單,聚類效果也不錯,因此應用很廣泛。k means演算法有大量的變體,本文就從最傳統的k means演算法講起,在其基礎上講述k means的優化變體方法。包括初始化優化k means 距離計算優化elkan k means演算法和大資料情況...
K means均值聚類演算法的原理與實現
聚類是一種無監督的學習,它將相似的物件歸到同乙個簇中,聚類方法幾乎可以應用於所有物件,簇內的物件越相似,聚類的效果越好,本文主要介紹k 均值聚類的演算法,之所以稱之為k 均值是因為它可以發現k個不同的簇,並且每個簇的中心採用簇中所含的值的均值計算而成 k 均值是發現給定資料集的k個簇的演算法,簇個數...