初始有m個數據, 那麼系統聚類一開始就有m個類, 再根據類之間的距離函數, 將最近的類聚集在一起, 直到用戶設定的K
a=[[1,0],
[1,1],
[3,2],
[4,3],
[2,5]]
cluster=[]
for i in range(shape(a)[0]):
cluster.append([i])
a=array(a)
centers=a.copy()
centers=centers.astype('float')
m,n=shape(a)
我們給出一個簡單的例子, 只有5條數據
我依次演示這個聚類過程
for k in range(m-1):#m
d=zeros((m-k,m-k))
for i in range(m-k):
for j in range(i+1,m-k):
d[i,j]=mandist(centers[i],centers[j])
nzInd=nonzero(d) #take care of it
minInd=d[nzInd].argmin(0)
mA=nzInd[0][minInd]
mB=nzInd[1][minInd]
cluster[mA].extend(cluster[mB])
cluster.remove(cluster[mB])
print cluster
for i in range(m-k-1):
#cluster distance: core method
centers[i]=mean(a[cluster[i]],axis=0)
結果爲
[[0, 1], [2], [3], [4]]
[[0, 1], [2, 3], [4]]
[[0, 1], [2, 3, 4]]
[[0, 1, 2, 3, 4]]
注意到這裏有兩個可供我們修改的地方
一個是距離函數, 這裏我使用的是馬氏距離, 而距離還有歐式距離之類的
def mandist(vecA,vecB):
return sum(abs(vecA-vecB))
二是類距離函數, 這裏我使用的是重心距離. 類距離函數還有 最近鄰 最遠距 等方法
centers[i]=mean(a[cluster[i]],axis=0)