它是基於給定的聚類目標函式,演算法採用迭代更新的方法,每一次迭代過程都是向目標函式減小的方向進行,最終聚類結果使得目標函式取得極小值,達到較好的分類效果。
在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 將樣本資料集分開的...