最简单的层次聚类算法及代码

给定要聚类的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]

    原文作者:聚类算法
    原文地址: https://blog.csdn.net/sinat_23588337/article/details/78607675
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞