聚类算法-最大最小距离算法

作者: 猫不爱吃鱼 | 来源:发表于2018-01-19 21:04 被阅读0次

    每篇一句:

    You're gonna have to face your fear,sooner or later. —《冰河世纪》


    最大最小距离算法:

    最大最小距离算法也成为小中取大距离算法。这种方法首先根据确定的距离阈值寻找聚类中心,然后根据最近邻规则把模式样本划分到各聚类中心对应的类别中。

    • 问题的提出

      已知N个待分类的模式样本{X1,X2,...,Xn},要求分别分类到聚类中心Z1,Z2,...对应的类别中。

    • 算法描述

      1.任选一个模式样本作为第一聚类中心Z1。

      2.选择离Z1距离最远的模式样本作为第二类聚类中心Z2。

      3.逐个计算每个模式样本与已知确定的所有聚类中心之间的距离,并选出其中的最小距离。

      4.在所有最小距离中选出一个最大距离,如果该最大值达到||Z1-Z2||的一定分数比值以上,则将产生最大距离的那个模式样本定义为新增聚类中心,并返回上一步。否则,聚类中心的计算步骤结束。

      5.重复步骤3和4,直到没有新的聚类中心出现为止。

      6.寻找聚类中心的运算结束后,将模式样本{Xi;i=1,2,...,n}按最近距离划分到相应的聚类中心所代表的的类别中。

    从上面的步骤可以看出,最大最小距离算法可以概括的描述为以“试探类间欧氏距离最大”作为预选出最初聚类中心的条件;根据最小距离中的最大距离情况,确定其余的聚类中心;将全部聚类中心确定完之后,再按最近距离将所有模式划分到各类中去。算法的关键是怎样开新类,以及新类中心如何确定。因为算法的核心是寻找最小距离中的最大距离,所以也称小中取大距离算法。


    python实现:

    • 解释说明见代码中注释
    # coding=utf-8
    
    # 最大最小距离算法的Python实现
    # 数据集形式data=[[],[],...,[]]
    # 聚类结果形式result=[[[],[],...],[[],[],...],...]
    # 其中[]为一个模式样本,[[],[],...]为一个聚类
    
    import math
    
    
    def start_cluster(data, t):
        zs = [data[0]]  # 聚类中心集,选取第一个模式样本作为第一个聚类中心Z1
        # 第2步:寻找Z2,并计算阈值T
        T = step2(data, t, zs)
        # 第3,4,5步,寻找所有的聚类中心
        get_clusters(data, zs, T)
        # 按最近邻分类
        result = classify(data, zs, T)
        return result
    
    
    # 分类
    def classify(data, zs, T):
        result = [[] for i in range(len(zs))]
        for aData in data:
            min_distance = T
            index = 0
            for i in range(len(zs)):
                temp_distance = get_distance(aData, zs[i])
                if temp_distance < min_distance:
                    min_distance = temp_distance
                    index = i
            result[index].append(aData)
        return result
    
    
    # 寻找所有的聚类中心
    def get_clusters(data, zs, T):
        max_min_distance = 0
        index = 0
        for i in range(len(data)):
            min_distance = []
            for j in range(len(zs)):
                distance = get_distance(data[i], zs[j])
                min_distance.append(distance)
            min_dis = min(dis for dis in min_distance)
            if min_dis > max_min_distance:
                max_min_distance = min_dis
                index = i
        if max_min_distance > T:
            zs.append(data[index])
            # 迭代
            get_clusters(data, zs, T)
    
    
    # 寻找Z2,并计算阈值T
    def step2(data, t, zs):
        distance = 0
        index = 0
        for i in range(len(data)):
            temp_distance = get_distance(data[i], zs[0])
            if temp_distance > distance:
                distance = temp_distance
                index = i
        # 将Z2加入到聚类中心集中
        zs.append(data[index])
        # 计算阈值T
        T = t * distance
        return T
    
    
    # 计算两个模式样本之间的欧式距离
    def get_distance(data1, data2):
        distance = 0
        for i in range(len(data1)):
            distance += pow((data1[i]-data2[i]), 2)
        return math.sqrt(distance)
    
    # 数据集
    data = [[0, 0], [3, 8], [1, 1], [2, 2], [5, 3], [4, 8], [6, 3], [5, 4], [6, 4], [7, 5]]
    # 设置阈值比例
    t = 0.5
    result = start_cluster(data, t)
    for i in range(len(result)):
        print "----------第" + str(i+1) + "个聚类----------"
        print result[i]
    
    # 打印结果:
    # ----------第1个聚类----------
    # [[0, 0], [1, 1], [2, 2]]
    # ----------第2个聚类----------
    # [[3, 8], [4, 8]]
    # ----------第3个聚类----------
    # [[5, 3], [6, 3], [5, 4], [6, 4], [7, 5]]
    
    

    最后:

    本文简单的介绍了 聚类算法——最大最小距离算法 的相关内容,以及相应的代码实现。如果有错误的或者可以改进的地方,欢迎大家指出。

    代码地址:聚类算法——最大最小距离算法(码云)


    原文地址:聚类算法——最大最小距离算法也是本人的CSDN账号,欢迎关注,博客会第一时间在CSDN更新。

    相关文章

      网友评论

        本文标题:聚类算法-最大最小距离算法

        本文链接:https://www.haomeiwen.com/subject/jmyaoxtx.html