計算智慧型 聚類演算法之k means演算法

2021-09-26 22:50:53 字數 2946 閱讀 7803

它是基於給定的聚類目標函式,演算法採用迭代更新的方法,每一次迭代過程都是向目標函式減小的方向進行,最終聚類結果使得目標函式取得極小值,達到較好的分類效果。

在k-means的損失函式中存在兩個未知的引數:乙個是每個資料所屬的類別;乙個是每個聚類的中心。這兩個未知的引數是相互依存的:如果知道每個資料的所屬類別,那麼類別的所有資料的平均值就是這個類別的中心;如果知道每個類別的中心,那麼就是計算資料與中心的距離,再根據距離的大小可以推斷出資料屬於哪乙個類別。

針對每個點,計算這個點距離所有中心點最近的那個中心點,然後將這個點歸為這個中心點代表的簇。一次迭代結束之後,針對每個簇類,重新計算中心點,然後針對每個點,重新尋找距離自己最近的中心點。如此迴圈,直到前後兩次迭代的簇類沒有變化。

首先隨機生成k個聚類中心點

根據聚類中心點,將資料分為k類。分類的原則是資料離哪個中心點近就將它分為哪一類別。

再根據分好的類別的資料,重新計算聚類的類別中心點。

不斷的重複2和3步,直到中心點不再變化。

流程圖

通常,「親疏程度」的測度一般都有兩個角度:第一,資料間的相似程度;第二,資料間的差異程度。衡量相似程度一般可採用簡單相關係數或等級相關係數等,差異程度則一般通過某種距離來測度。kmeans聚類方法採用的是第二個測度角度。

為有效測度資料之間的差異程度, kmeans聚類演算法將所收集到具有p個變數的樣本資料,看成p維空間上的點,並以此定義某種距離。通常,點與點之間的距離越小,意味著它們越「親密」,差異程度越小,越有可能聚成一類;相反,點與點之間的距離越大,意味著它們越「疏遠」,差異程度越大,越有可能分屬不同的類。

由於kmeans聚類方法所處理的聚類變數均為數值型,因此,它將點與點之間的距離定義為歐氏距離,即資料的距離是兩個點的p個變數之差的平方和的算術平方根,數學定義為

d(x,y)=(x1

−y1)

2+(x

2−y2

)2+(

x3−y

3)2.

.\sqrt (x1-y1)^2+(x2-y2)^2+(x3-y3)^2..

(​x1−y

1)2+

(x2−

y2)2

+(x3

−y3)2..

(a)帶聚類樣本,現將樣本目標聚成2類。

(b)選取2個中心點,即k=2。

(c)對每個樣本,找到距離自己最近的中心點,完成一次聚類。聚類前後樣本點的聚類情況不相同,繼續下一步。

(d)根據c類聚的結果更新中心點。同時,再次進行c步驟,聚類前後樣本點的聚類情況不相同,繼續下一步。

(e)根據d類聚的結果更新中心點。同時,再次進行c步驟,聚類前後樣本點的聚類情況不相同,繼續下一步。

(e)聚類前後樣本點的聚類情況不相同,演算法結束。

優點

1、原理比較簡單,實現也是很容易,收斂速度快。

2、當結果簇是密集的,而簇與簇之間區別明顯時, 它的效果較好。

缺點

1、k值需要預先給定。

2、開局不同的中心點 對結果影響很大。

3、對噪音和異常點比較的敏感。

4、採用迭代方法,可能只能得到區域性的最優解,而無法得到全域性的最優解。

#include

"stdio.h"

#include

"stdlib.h"

#include

"math.h"

#include

using namespace std;

#define n 11

#define k 3

//設分成三類

typedef

struct

point;

point point[n]=,

,,,,

,,,,

,};int center[n]

;point mean[k]

;//計算距離函式,歐式距離

float

getdistance

(point point1, point point2)

//聚類函式

void

cluster()

float min =

9999.0

;for

(int j =

0; j < k; j++)}

printf

("(%.0f,%.0f)\t 屬於第%d類\n"

, point[i]

.x, point[i]

.y, center[i]+1

);}}

//聚類後誤差計算函式

float

gete()

} sum +

= cnt;

}return sum;

}//重新計算聚類中心

void

getmean

(int center[n])}

mean[i]

.x = sum.x / count;

mean[i]

.y = sum.y / count;

}for

(int i =

0; i < k; i++)}

intmain()

printf

("總聚類次數:%d\n"

, number)

;system

("pause");

return0;

}

參考資料:

k-means演算法執行速度快,實現簡便,容易理解,直到兩次迭代誤差的差值在一定閾值範圍內就迭代停止得出結果。但k-means演算法對具有變化大小,變化密度,非圓形狀等特點的資料具有侷限性。解決方法是增加k的大小,增加簇數量,使得資料的特徵能夠更加明顯。

聚類演算法之Kmeans

kmeans是聚類演算法中比較簡單的演算法,也用的非常多。這裡進行簡單的解釋,主要目的在於給自己記錄,以備以後檢視。k均值聚類的主要思想是為了使得各個類的點離聚類中心都盡可能近。k均值聚類的演算法可以描述為 輸入 資料集d d 聚類簇個數 k 演算法 從資料集d中隨機選擇k個樣本作為初始聚類中心 r...

聚類演算法之K means

k means演算法也稱k 均值聚類演算法。它試圖通過基於原型的 劃分的距離計算來發現k個使用者預先指定的簇。將一組資料劃分為預先設定好的k個簇,也可理解為隨機選擇k個向量作為初始均值向量。接下來根據均值向量將樣本劃分到距離最近的均值向量所在的簇中。這是一次迭代過程。重新計算並更新均值向量,不斷重複...

聚類演算法之K Means演算法

對大量未進行標註 unsupervised learning 的資料集,並按照資料集本身的內部資料特徵將資料劃分為多個不同的類別,從而使得類別內的資料相似度高,而類別間的資料差異性較大。因此,它的重點就在於計算樣本間的相似度 similarity 輸入演算法所需資料,資料樣本集d 將樣本資料集分開的...