一、设计目的
-
掌握层次聚类算法原理与实现
深入理解AGNES算法的自底向上聚合策略,包括簇间距离计算(单链接、全链接、均值链接)的核心原理,并能通过代码实现算法核心逻辑(如距离矩阵更新、簇合并策略)。 -
探究不同距离度量对聚类结果的影响
对比最小距离(单链接)、最大距离(全链接)、平均距离(均链接)等度量方式,分析其对簇结构松紧度和异常值敏感性的影响。例如,单链接易产生链式簇,全链接对噪声敏感。 -
实现动态可视化与过程分析
结合Matplotlib动画框架,展示聚类合并的逐步过程,通过树状图(Dendrogram)和散点图直观反映簇间关系与层次结构。动态更新距离矩阵和簇标注,增强算法可解释性。 -
培养工程化实现与性能优化能力
解决大规模数据下的时间复杂度(O(n²))和内存消耗问题,优化距离矩阵存储方式(如上三角矩阵压缩),并验证算法在不同数据集上的扩展性。
二、设计描述
下面给出一个样本书物数据库,如下表所示,并对它实施 AGNES 算法。
表 样本事务数据库
序号 | 属性 1 | 属性 2 |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 2 | 2 |
5 | 3 | 4 |
6 | 3 | 5 |
7 | 4 | 4 |
8 | 4 | 5 |
在所给的数据集上运行 AGNES算法,算法的执行过程如下表所示,设 n=8,用户输入的终止条件为两个簇。初始簇为 {1},{2},{3},{4},{5},{6},{7},{8}(采用欧氏距离进行计算)。
表 AGNES算法执行过程
步骤 | 最近的簇距离 | 最近的两个簇 | 合并后的新簇 |
---|---|---|---|
1 | 1 | {1},{2} | {1,2},{3},{4},{5},{6},{7},{8} |
2 | 1 | {3},{4} | {1,2},{3,4},{5},{6},{7},{8} |
3 | 1 | {5},{6} | {1,2},{3,4},{5,6},{7},{8} |
4 | 1 | {7},{8} | {1,2},{3,4},{5,6},{7,8} |
5 | 1 | {1,2},{3,4} | {1,2,3,4},{5,6},{7,8} |
6 | 1 | {5,6},{7,8} | {1,2,3,4},{5,6,7,8}结束 |
具体步骤如下:
-
根据初始簇计算每个簇之间的距离,随机找出距离最小的两个簇,进行合并。点1、2间的欧氏距离 d(1,2)=[(1−1)2+(2−1)2]^1/2=1为最小距离,故将1、2点合并为一个簇。
-
对上一次合并后的簇计算簇间距离,找出距离最近的两个簇进行合并,合并后3、4点成为一簇。
-
重复第2步的工作,5、6点成为一簇。
-
重复第2步的工作,7、8点成为一簇。
-
合并{1, 2}, {3, 4}成为一个包含四个点的簇。
-
合并{5, 6}, {7, 8},由于合并后的簇的数目已经达到了终止条件,计算完毕。
三、设计过程
3.1 数据预处理
3.1.1 数据结构设计
- Point类:封装二维坐标、ID标识,实现欧氏距离计算(
calc_distance
方法)。 - 簇存储结构:使用字典管理簇,键为簇ID,值为点列表和颜色属性,支持动态合并与删除。
3.1.2 数据标准化与加载
- 硬编码数据集:包含8个二维点,初始每个点独立成簇。
- 距离矩阵构建:计算所有点对的欧氏距离,存储为对称矩阵以减少冗余计算。
3.2 算法设计逻辑
3.2.1 簇间距离计算策略
- 单链接(最小距离):
dist_min
函数取两簇最近点距离,适合发现链状簇但易受噪声干扰。 - 全链接(最大距离):
dist_max
函数取两簇最远点距离,生成紧凑簇但对异常值敏感。 - 均链接:计算两簇所有点对的平均距离,平衡单链接和全链接的优缺点。
3.2.2 簇合并与矩阵更新
- 查找最近簇:遍历距离矩阵上三角,定位最小距离对应的簇索引。
- 合并操作:
- 生成新簇ID,合并两簇的点集。
- 冻结原簇在矩阵中的行列(置为无穷大),避免重复计算。
- 矩阵更新:
- 新增行列存储新簇与其他簇的最小距离(单链接策略)。
- 时间复杂度优化:仅更新必要部分,避免全矩阵重建。
3.3 核心模块实现
3.3.1 数据结构与初始化模块
class Point:
def __init__(self, x: