優點:容易實現
缺點:可能收斂到區域性最小值,在大規模資料集上收斂較慢
使用資料型別:數值型資料
k-means演算法實際上就是通過計算不同樣本間的距離來判斷他們的相近關係的,相近的就會放到同乙個類別中去。
1.首先我們需要選擇乙個k值,也就是我們希望把資料分成多少類,這裡k值的選擇對結果的影響很大,ng的課說的選擇方法有兩種一種是elbow method,簡單的說就是根據聚類的結果和k的函式關係判斷k為多少的時候效果最好。另一種則是根據具體的需求確定,比如說進行襯衫尺寸的聚類你可能就會考慮分成三類(l,m,s)等
2.然後我們需要選擇最初的聚類點(或者叫質心),這裡的選擇一般是隨機選擇的,**中的是在資料範圍內隨機選擇,另一種是隨機選擇資料中的點。這些點的選擇會很大程度上影響到最終的結果,也就是說運氣不好的話就到區域性最小值去了。這裡有兩種處理方法,一種是多次取均值,另一種則是後面的改進演算法(bisecting k-means)
3.終於我們開始進入正題了,接下來我們會把資料集中所有的點都計算下與這些質心的距離,把它們分到離它們質心最近的那一類中去。完成後我們則需要將每個簇算出平均值,用這個點作為新的質心。反覆重複這兩步,直到收斂我們就得到了最終的結果。
loaddataset(filename)
從檔案中讀取資料集
disteclud(veca, vecb)
計算距離,這裡用的是歐氏距離,當然其他合理的距離都是可以的
randcent(dataset, k)
隨機生成初始的質心,這裡是雖具選取資料範圍內的點
kmeans(dataset, k, distmeas=disteclud, createcent=randcent)
kmeans演算法,輸入資料和k值。後面兩個事可選的距離計算方式和初始質心的選擇方式
show(dataset, k, centroids, clusterassment)
視覺化結果
1這裡是聚類結果,還是很不錯的啦#coding=utf-8
2from numpy import *34
def loaddataset(filename):
5 datamat =
6 fr =open(filename)
7for line in
fr.readlines():
8 curline = line.strip().split('\t'
)9 fltline = map(float
, curline)
1011
return
datamat
1213
#計算兩個向量的距離,用的是歐幾里得距離
14def disteclud(veca, vecb):
15return sqrt(sum(power(veca - vecb, 2
)))16
17#隨機生成初始的質心(ng的課說的初始方式是隨機選k個點)
18def randcent(dataset, k):
19 n = shape(dataset)[1
]20 centroids =mat(zeros((k,n)))
21for j in
range(n):
22 minj =min(dataset[:,j])
23 rangej = float(max(array(dataset)[:,j]) -minj)
24 centroids[:,j] = minj + rangej * random.rand(k,1)25
return
centroids
2627 def kmeans(dataset, k, distmeas=disteclud, createcent=randcent):
28 m = shape(dataset)[0
]29 clusterassment = mat(zeros((m,2
)))#create mat to assign data points
30#to a centroid, also holds se of each point
31 centroids =createcent(dataset, k)
32 clusterchanged =true
33while
clusterchanged:
34 clusterchanged =false
35for i in range(m):#for
each data point assign it to the closest centroid
36 mindist =inf
37 minindex = -1
38for j in
range(k):
39 distji =distmeas(centroids[j,:],dataset[i,:])
40if distji
41 mindist = distji; minindex =j
42if clusterassment[i,0] !=minindex:
43 clusterchanged =true
44 clusterassment[i,:] = minindex,mindist**2
45print centroids
46for cent in
range(k):#recalculate centroids
47 ptsinclust = dataset[nonzero(clusterassment[:,0].a==cent)[0]]#get all the point in
this
cluster
48 centroids[cent,:] = mean(ptsinclust, axis=0
) #assign centroid to mean
49return
centroids, clusterassment
5051
def show(dataset, k, centroids, clusterassment):
52from matplotlib import pyplot as
plt
53 numsamples, dim =dataset.shape
54 mark = ['
or', '
ob', '
og', '
ok', '
^r', '
+r', '
sr', '
dr', '
', 'pr'
] 55
for i in
xrange(numsamples):
56 markindex = int(clusterassment[i, 0
])
57 plt.plot(dataset[i, 0], dataset[i, 1
], mark[markindex])
58 mark = ['
dr', '
db', '
dg', '
dk', '
^b', '
+b', '
sb', '
db', '
', 'pb'
] 59
for i in
range(k):
60 plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12
) 61
plt.show()
6263
def main():
64 datamat = mat(loaddataset('
testset.txt'))
65 mycentroids, clustassing= kmeans(datamat,4)66
print mycentroids
67 show(datamat, 4
, mycentroids, clustassing)
6869
70if __name__ == '
__main__':
71 main()
但是有時候也會收斂到區域性最小值,就像下面這樣,就是不幸收斂到區域性最優了
K Means聚類演算法
k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...
聚類演算法 K means
演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...
k means聚類演算法
說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...