给定要聚类的N的对象以及N*N的距离矩阵(或者是相似性矩阵), 层次式聚类方法的基本步骤(参看S.C. Johnson in 1967)如下:
1 将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.
2 找到最接近的两个类并合并成一类, 于是总的类数少了一个.
3 重新计算新的类与所有旧类之间的距离.
4 重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).
database={1,2,3,4,5,9,10,11,12,17,18,19,80,88,90,21}
def distan(x,y):
# 求两个实体之间的距离,要替换距离算法
return abs(x-y)
def cludiatan(cluster1,cluster2):
sum=0
for i in cluster1:
for j in cluster2:
tem=distan(i,j)
sum+=tem
average=sum/(len(cluster1)+len(cluster2))
# print(average)
return average
l=list()
for m in database:
n=list()
n.append(m)
l.append(n)
while len(l)>4:
min = 100
for i in l:
for j in l:
if i != j: #
similarity = cludiatan(i, j)
if min > similarity:
min = similarity
geti = i # get 最小值 時 的兩個post名稱
getj = j
else: # 如果相同就直接pass不用看
pass
l.remove(geti)
l.remove(getj)
clus=list()
clus.extend(geti)
clus.extend(getj)
l.append(clus)
#print(len(l))
for o in l:
print(o)
输出:
[9, 10, 11, 12]
[17, 18, 19, 21]
[1, 2, 5, 3, 4]
[80, 88, 90]