初始有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)