实验五:层次聚类实验报告

一、实验目的

  1. 了解聚类的概念和层次聚类的方法
  2. 实现三种不同的层次聚类算法
  3. 对比三种不同算法在不同的数据集的情况下的性能

二、代码框架

  • 本次实验使用的函数框架如下:

    1.create_sample(mean, cov, num, label)
      #生成样本均值向量为mean,协方差矩阵为cov的,数量为num,标签为label的数据集
    2.PoMinkowski(x1,x2,dimension,p=2)
      #两样本点之间Minkowski距离,dimension表示样本的特征维数,p=2时,计算的是欧氏距离
    3.clusingle(clu1,clu2,dimension,p=2)
      #最短距离/单连接 (single linkage)
    4.clucomplete(clu1,clu2,dimension,p=2)
      #最⻓距离/全连接 (complete linkage)
    5.cluaverage(clu1,clu2,dimension,p=2)
      #平均距离 (average linkage)
    6.discluster(cluster,dimension,kind=0,p=2)
      #类距离矩阵的生成,kind表示使用3,4,5中的哪种方法生成类距离矩阵
    7.dismin(distance)
      #根据类距离矩阵确定距离最近的两个类
    8.update(cluster,res)
      #更新类,将cluster中的res编号的两个类合并
    9.datastat(cluster)
      #数据统计,统计合并完成后生成的三个类的数据
    10.aggregation(cluster,dimension,kind=0,p=2)
      #聚合操作
    11.makeplt3D(List)
      #根据List绘制三维点空间分布图
    12.makeplt2D(List,label1)
      #根据List和label绘制分布直方图
    

三、代码详解

  1. 产生数据

    # 生成数据
    def create_sample(mean, cov, num, label):
        '''
        :param mean: 均值向量
        :param cov: 协方差矩阵
        :param num: 数量
        :param label: 标签
        :return: 最终生成的数据前三列表示特征,后一列表示便签
        '''
        x,y,z=np.random.multivariate_normal(mean,cov,num).T
        L = np.ones(num)*label
        X=np.array([x,y,z,L])
        return X.T
    

    使用np.random.multivariate_normal函数生成均值向量为mean,协方差矩阵为cov,数量为num,标签为label的样本数据。

  2. 两点之间的距离计算

       def PoMinkowski(x1,x2,dimension,p=2):
           '''
           :param x1: 点x1
           :param x2: 点x2
           :param dimension: 两个点所在的空间维度
           :param p: 参数p=2时为欧氏距离
           :return: 距离
           '''
           dis = 0
           for i in range(dimension):
               dis = dis + math.pow(x1[i]-x2[i],p)
           return math.sqrt(dis)
    

    在这里插入图片描述
    在本次试验中使用闵可夫斯基距离进行计算,默认使用p=2,即计算两个点之间的欧氏距离

  3. 三种层次聚类算法(基本要求和中级要求)

    # 最短距离single linkage
    def clusingle(clu1,clu2,dimension,p=2):
    
        Min = float("inf")
        for i in range(len(clu1)):
            for j in range(len(clu2)):
                d=PoMinkowski(clu1[i],clu2[j],dimension,p)
                Min = d if d < Min else Min
        return Min
    
    # 最长距离complete linkage
    def clucomplete(clu1,clu2,dimension,p=2):
    
        Max = float("-inf")
        for i in range(len(clu1)):
            for j in range(len(clu2)):
                d = PoMinkowski
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是兔不是秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值