Kmeans聚類演算法原理與實現

2022-03-16 09:34:58 字數 3508 閱讀 2041

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個簇的演算法,簇個數...