k-means演算法也稱k-均值聚類演算法。它試圖通過基於原型的、劃分的距離計算來發現k個使用者預先指定的簇。
將一組資料劃分為預先設定好的k個簇,也可理解為隨機選擇k個向量作為初始均值向量。接下來根據均值向量將樣本劃分到距離最近的均值向量所在的簇中。這是一次迭代過程。
重新計算並更新均值向量,不斷重複該過程直到前後兩次迭代得到的均值向量不再發生變化為止。
注:為避免k-means演算法的執行時間過長,可以設定乙個最大執行輪數或最小調整幅度閾值。即當達到最大輪數或調整幅度小於閾值時,停止執行。
樣本集:d=(
x1,x
2,..
.,xm
);
\ d=()\,;
d=(x1
,x2
,...
,xm
);初始均值向量:(μ1,
μ2,.
..,μ
k)
;\ \,);
μ1,μ2
,..
.,μk
);
簇:c=(
c1,c
2,..
.,ck
);
\ c=()\,;
c=(c1
,c2
,...
,ck
);計算新均值向量:μi=
1∣ci
∣∑x∈
ci
\mu_i^ = \frac_}}
μi=∣c
i∣1
∑x∈
ci
誤差平方和(sum of the squared error,sse):sse
=∑i=
1k∑x
∈ci∣
∣x−μ
i∣∣2
2\ sse = \sum_^k \sum_}}||x-\mu_i||_2^2\,
sse=i=
1∑k
x∈c
i∑
∣∣x−
μi∣
∣22
因此sse值越小,簇內樣本相似度越高,則聚類效果越理想。
3.1.k-means演算法的優點:
3.2.k-means演算法的缺點:
3.3.k-means演算法的優化:
注:對於非凸的資料集,k-means比較難收斂。因此建議採用基於密度的演算法,如descan演算法。
# dataset: 資料集;k:簇的個數
# dismeas距離量度 (預設為歐幾里得距離)
# createcent: 初始點的選取
defkmeans
(dataset, k, distmeas=disteclud, createcent=randcent)
: m = shape(dataset)[0
] clusterassment = mat(zeros(
(m,2))
)
centroids = createcent(dataset, k)
clusterchanged =
true
while clusterchanged:
clusterchanged =
false
for i in
range
(m):
#找到最近的質心
mindist = inf; minindex =-1
for j in
range
(k):
distji = distmeas(centroids[j,:]
,dataset[i,:]
)if distji < mindist:
mindist = distji; minindex = j
if clusterassment[i,0]
!= minindex: clusterchanged =
true
clusterassment[i,:]
= minindex,mindist**
2print centroids
# 更改質心位置
for cent in
range
(k):
ptsinclust = dataset[nonzero(clusterassment[:,
0].a==cent)[0
]]centroids[cent,:]
= mean(ptsinclust, axis=0)
return centroids, clusterassment
聚類演算法之Kmeans
kmeans是聚類演算法中比較簡單的演算法,也用的非常多。這裡進行簡單的解釋,主要目的在於給自己記錄,以備以後檢視。k均值聚類的主要思想是為了使得各個類的點離聚類中心都盡可能近。k均值聚類的演算法可以描述為 輸入 資料集d d 聚類簇個數 k 演算法 從資料集d中隨機選擇k個樣本作為初始聚類中心 r...
聚類演算法之K Means演算法
對大量未進行標註 unsupervised learning 的資料集,並按照資料集本身的內部資料特徵將資料劃分為多個不同的類別,從而使得類別內的資料相似度高,而類別間的資料差異性較大。因此,它的重點就在於計算樣本間的相似度 similarity 輸入演算法所需資料,資料樣本集d 將樣本資料集分開的...
經典演算法之k means聚類
原理 給定一系列樣本點,想要分成k類 1 首先從中隨機選取k個點作為質心 2 分別計算每個點到這k個質心的歐式距離 為例 到哪個質心距離最小,這個點就屬於這個質心,這樣把所有點分成k類 3 再分別計算k類中每一類新的質心,根據公式2 4 迭代 2 3 直到達到最優條件,條件如最小距離平方和公式3 公...