模式识别:凝聚式层次聚类算法底层实现项目
项目介绍
本项目通过 MATLAB 语言实现了一个完整的凝聚式层次聚类(Agglomerative Hierarchical Clustering)系统。与调用高层工具箱函数不同,本项目完全基于底层逻辑构建,通过手动编写距离计算、簇合并逻辑及联动准则(Linkage Criteria)更新机制,清晰地展现了聚类算法从单个样本点逐步聚合为预设类簇数的完整动态过程。该实现方式有助于深入理解层次聚类在模式识别中的数学原理及其在不同联动策略下的表现差异。
功能特性
- 完全自主实现:核心算法不依赖
linkage、cluster、pdist 等 MATLAB 统计工具箱函数。 - 多种联动准则支持:程序预置了三种主流的距离演化策略:
*
最短距离法(Single Linkage):以两个类簇间最近样本点的距离作为簇间距离。
*
最长距离法(Complete Linkage):以两个类簇间最远样本点的距离作为簇间距离。
*
平均距离法(Average Linkage):计算两个类簇所有样本点对之间距离的算术平均值。
- 内建数据生成与预处理:自动生成高斯分布模拟数据,并提供基于 Z-score 的特征标准化处理功能,确保距离度量的公平性。
- 矩阵维护机制:通过逻辑掩码(Active Mask)和动态索引管理,实时维护活跃类簇之间的距离矩阵。
- 过程可视化:输出合并过程的阶梯记录,并生成原始数据与聚类结果的直观对比图表。
算法实现逻辑与步骤
- 数据初始化与标准化:
程序首先生成三个不同均值的高斯分布样本集。在聚类开始前,算法对特征空间执行标准化处理,即减去均值并除以标准差,消除不同维度量纲的影响。
- 初始欧式距离矩阵计算:
通过嵌套双重循环扫描所有样本对,手动应用欧氏距离公式 $d = sqrt{sum(x_i - y_i)^2}$,构建一个 $N times N$ 的对称距离矩阵。
- 凝聚式合并循环:
在每一轮迭代中,程序执行以下操作:
*
搜索最小值:在当前活跃的距离矩阵中寻找非对角线的最小值,定位目前距离最近的两个类簇。
*
记录合并轨迹:将合并的簇索引和对应的合并距离存入历史记录,用于追踪聚类层级。
*
类簇成员合并:使用元胞数组(Cell Array)容器,将两个簇包含的样本索引进行合并。
*
更新状态:标记被合并的簇为无效状态(False),减少当前活跃簇的总计数。
- 联动准则更新逻辑:
这是算法的核心部分。每当两个类簇 $i$ 和 $j$ 合并为新簇时,程序会遍历所有其他活跃类簇 $k$,提取新簇成员与 $k$ 簇成员之间所有的点对距离,并根据预设的联动准则(min、max、mean)重新计算并更新距离矩阵中的值。
- 标签映射与分类输出:
当活跃簇数量降至用户预设的目标值时,循环终止。程序通过扫描最终的成员容器,将原始样本的索引映射为类别标签。
关键细节分析
- 簇成员管理:代码巧妙地利用元胞数组存储每个类簇所拥有的原始数据索引,这使得在更新平均联动距离时,能够精确地获取两簇之间所有可能的点对距离,而不是简单地进行质心计算。
- 活跃矩阵优化:利用布尔掩码(Mask)来标识哪些行和列代表仍然有效的独立簇,从而在不破坏原始矩阵结构的前提下实现高效的最小值检索。
- 距离度量的一致性:在联动更新阶段,程序直接引用初始计算好的原始点对距离矩阵,保证了聚类过程中距离度量的原始性和一致性。
使用方法
- 配置参数:在程序开头修改样本数量(n_samples)、目标类别数(n_clusters_target)以及联动策略(linkage_type)。
- 执行程序:在 MATLAB 环境下直接运行脚本。
- 查看结果:
* 控制台将打印出合并过程的前五步详情。
* 图形窗口左侧显示未处理的原始数据点。
* 图形窗口右侧显示根据层次聚类算法划分后的彩色类别点,并根据选择的策略显示对应的图例。
系统要求
- 环境:MATLAB R2016b 或更高版本。
- 工具箱:虽然核心逻辑不依赖工具箱,但数据生成部分使用了
mvnrnd 函数(属于统计与机器学习工具箱),若环境中无此函数,可手动替换为标准正态分布生成逻辑。