西瓜书学习笔记——层次聚类(公式推导+举例应用)

news/2024/5/20 10:37:38 标签: 学习, 笔记, 聚类

文章目录

      • 算法介绍
      • 实验分析

算法介绍

层次聚类是一种将数据集划分为层次结构的聚类方法。它主要有两种策略:自底向上自顶向下
其中AGNES算法是一种自底向上聚类算法,用于将数据集划分为层次结构的聚类。算法的基本思想是从每个数据点开始,逐步合并最相似的簇,直到形成一个包含所有数据点的大簇。这个过程被反复执行,构建出一个层次化的聚类结构。这其中的关键就是如何计算聚类簇之间的距离。 但实际上,每个簇都是一个集合,故我们只需要计算集合与集合的距离即可。例如,给定聚类 C i C_i Ci C j C_j Cj,可通过下面的式子来计算距离:
d m i n ( C i , C j ) = min x ∈ C i , z ∈ C j   d i s t ( x , z ) (1) d_{min}(C_i,C_j)=\underset{x \in C_i,z\in C_j}{\text{min}} \ dist(x,z) \tag{1} dmin(Ci,Cj)=xCi,zCjmin dist(x,z)(1)
d m a x ( C i , C j ) = max x ∈ C i , z ∈ C j   d i s t ( x , z ) (2) d_{max}(C_i,C_j)=\underset{x \in C_i,z\in C_j}{\text{max}} \ dist(x,z) \tag{2} dmax(Ci,Cj)=xCi,zCjmax dist(x,z)(2)
d a v g ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ x ∈ C i ∑ z ∈ c j d i s t ( x , z ) (3) d_{avg }(C_i,C_j)=\frac{1}{|C_i||C_j|}\sum_{x\in C_i}\sum_{z\in c_j} dist(x,z) \tag{3} davg(Ci,Cj)=Ci∣∣Cj1xCizcjdist(x,z)(3)

其中 ∣ C i ∣ |C_i| Ci是集合 C i C_i Ci的元素个数。显然最小距离是由两个簇最近的样本点决定的;最大距离是由两个簇最远的样本点决定的;平均距离是由两个簇所有样本点共同决定的。

还有个更有效的计算集合距离的方法豪斯多夫距离:假设在同一样本空间的集合 X X X Z Z Z之间的距离可以通过以下式子计算:
dist ⁡ H ( X , Z ) = max ⁡ ( dist ⁡ h ( X , Z ) , dist ⁡ h ( Z , X ) ) (4) \operatorname{dist}_{\mathrm{H}}(X, Z)=\max \left(\operatorname{dist}_{\mathrm{h}}(X, Z), \operatorname{dist}_{\mathrm{h}}(Z, X)\right) \tag{4} distH(X,Z)=max(disth(X,Z),disth(Z,X))(4)

其中 dist ⁡ h ( X , Z ) = max ⁡ x ∈ X min ⁡ z ∈ Z ∥ x − z ∥ 2 \operatorname{dist}_{\mathrm{h}}(X, Z)=\max _{\boldsymbol{x} \in X} \min _{\boldsymbol{z} \in Z}\|\boldsymbol{x}-\boldsymbol{z}\|_2 disth(X,Z)=maxxXminzZxz2

豪斯多夫距离的应用涉及到形状匹配、图像匹配、模式识别等领域,它对于描述两个集合的整体形状之间的差异具有较好的效果。然而,由于计算豪斯多夫距离涉及到点之间的一一匹配,因此在实际应用中可能需要考虑一些优化算法以提高计算效率。

下图是AGNES算法流程图:
在这里插入图片描述

实验分析

数据集如下表所示:
在这里插入图片描述
读入数据集:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('data/4.0.csv')

定义距离函数:

# 定义豪斯多夫距离函数
def hausdorff_distance(cluster1, cluster2):
    max_distance1 = max(min(distance(p1, p2) for p1 in cluster1) for p2 in cluster2)
    max_distance2 = max(min(distance(p1, p2) for p2 in cluster2) for p1 in cluster1)
    return max(max_distance1, max_distance2)

# 定义距离函数
def distance(point1, point2):
    return ((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2) ** 0.5

AGNES算法:

# AGNES算法
def agnes(data):
    clusters = [[point] for point in data.values]

    while len(clusters) > 4:
        min_distance = float('inf')
        merge_indices = (0, 0)

        for i in range(len(clusters)):
            for j in range(i + 1, len(clusters)):
                cluster1 = clusters[i]
                cluster2 = clusters[j]

                current_distance = hausdorff_distance(cluster1, cluster2)

                if current_distance < min_distance:
                    min_distance = current_distance
                    merge_indices = (i, j)

        # 合并最近的两个簇
        merged_cluster = clusters[merge_indices[0]] + clusters[merge_indices[1]]
        clusters.pop(merge_indices[1])
        clusters[merge_indices[0]] = merged_cluster

    return clusters

绘制分类结果函数:

# 绘制分类结果
def plot_clusters(data, clusters):
    plt.figure(figsize=(8, 8))

    # 绘制原始数据点
    plt.scatter(data['Density'], data['Sugar inclusion rate'], color='black', label='Original Data')

    # 绘制分类结果
    for i, cluster in enumerate(clusters):
        cluster_data = pd.DataFrame(cluster, columns=['Density', 'Sugar inclusion rate'])
        plt.scatter(cluster_data['Density'], cluster_data['Sugar inclusion rate'], label=f'Cluster {i + 1}')

    # 添加标签和图例
    plt.title('AGNES Clustering Result')
    plt.xlabel('Density')
    plt.ylabel('Sugar inclusion rate')
    plt.legend()
    plt.show()

执行AGNES且画出分类结果:

# 执行层次聚类
result_clusters = agnes(data)

# 输出聚类结果
for i, cluster in enumerate(result_clusters):
    print(f'Cluster {i + 1}: {cluster}')
    
# 绘制分类结果图
plot_clusters(data, result_clusters)

在这里插入图片描述


http://www.niftyadmin.cn/n/5354433.html

相关文章

opencv——将2张图片合并

效果演示: 带有绿幕的图片的狮子提取出来,放到另一种风景图片里! 1. 首先我们要先口出绿色绿幕,比如: 这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。 代码 : import cv2 as cv import numpy as np import matplotlib.pyplot as plt def showI…

JAVA项目扩展-多数据库连接(实现一个简单的数据库jdbc连接池)

一 JAVA项目扩展多数据库连接背景与选择技术方案。 有时候一些旧项目因业务变更而需要多数据库连接&#xff0c;但原本项目往往只配置了一个数据源。像SpringBoot框架&#xff0c;如果需要重新配置多数据&#xff0c;往往原有的数据源也要重新调整配置&#xff0c;至少要设置一…

【蓝桥杯冲冲冲】进阶搜索 Anya and Cubes

蓝桥杯备赛 | 洛谷做题打卡day22 文章目录 蓝桥杯备赛 | 洛谷做题打卡day22Anya and Cubes题面翻译输入格式输出题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示题解代码我的一些话 Anya and Cubes …

透明拼接屏生产全解析:从生产流程到质量标准与出货流程

透明拼接屏&#xff0c;作为现代显示技术中的佼佼者&#xff0c;其生产过程复杂而严谨。本文将详细介绍透明拼接屏的生产流程、质量标准以及出货流程&#xff0c;尼伽小编带您了解这一高科技产品背后的精湛工艺。 一、生产流程 原材料采购与检验&#xff1a;生产透明拼接屏的第…

Servlet Cookie和Session

Cookie和Session http协议是一个无状态的协议&#xff0c;你每一个跳转到下一个页面的时候都是需要先登录才能使用&#xff0c;这样就很麻烦比如淘宝&#xff0c;没有cookie和session的话&#xff0c;用户在首页已经登录上去了&#xff0c;但是需要再次登录才能选择商品&#…

2024年最新版 在AlmaLinux上安装MongoDB

2024年 在AlmaLinux上安装MongoDB 一、前言 在安装yapi的时候的需要安装mongodb遂与gpt交互&#xff0c;安装好mongodb。 下面步骤已经全部走完&#xff0c;没有问题。 二、具体步骤 在AlmaLinux上安装MongoDB&#xff0c;您可以按照以下步骤操作&#xff1a; 1、配置Mong…

【QT+QGIS跨平台编译】之九:【LZ4+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、LZ4介绍二、文件下载三、文件分析四、pro文件五、编译实践一、LZ4介绍 LZ4是一种无损压缩算法,压缩速度为每核心400MB/s。 LZ4是目前效率最高的压缩算法,更加侧重于压缩/解压缩速度,压缩比并不突出,本质上就是时间换空间。 LZ4库是使用BSD许可证作为开放源码…

人工智能与低代码开发: 创新技术的未来

本文将探讨人工智能与低代码开发两个创新技术的结合&#xff0c;并为读者展示这种结合对未来技术发展的巨大潜力。我们将介绍人工智能和低代码开发的概念&#xff0c;并探讨它们分别在软件开发领域的作用。接着&#xff0c;我们将讨论它们如何相互影响和协作&#xff0c;以及它…