基于MATLAB的K-means聚类算法实现与分析
项目介绍
本项目提供了一套完整的K-means聚类算法MATLAB实现。该程序不仅实现了经典的核心聚类逻辑,还包含了数据合成、预处理、算法优化(K-means++初始化策略)以及详细的可视化分析功能。代码旨在解决非监督学习中的数据分组问题,通过迭代优化将数据划分为K个互不重叠的簇,适用于算法学习、数据分析及模式识别的基础研究。
主要功能特性
- 合成数据生成:内置基于高斯分布(Multivariate Normal Distribution)的随机数据生成器,可自动构建包含明显聚类特征的二维数据集,便于验证算法效果。
- 数据预处理:实现了Z-score标准化(Standardization),确保不同量纲的特征对距离计算具有同等权重,提高聚类准确性。
- 优化的初始化策略:代码中实现了 K-means++ 初始化算法,而非简单的随机选择。通过概率加权选择初始质心,显著降低了算法陷入局部最优的风险。
- 高效距离计算:采用完全向量化的矩阵运算计算欧氏距离平方,避免了低效的循环操作,显著提升运算速度。
- 鲁棒性设计:包含对“空簇”情况的异常处理机制,防止迭代过程中因簇内样本均为空而导致的程序崩溃。
- 全过程可视化:提供双视图对比(原始数据 vs 聚类结果),并绘制质心移动轨迹、初始位置与最终位置,直观展示算法收敛过程。
系统要求
- MATLAB R2016a 或更高版本
- Statistics and Machine Learning Toolbox(用于
mvnrnd 函数生成合成数据)
使用方法
- 将代码文件保存到MATLAB的工作目录中。
- 直接运行主函数
main。 - 程序将自动执行以下流程:生成数据 -> 标准化 -> 迭代聚类 -> 反标准化 -> 绘图 -> 输出统计结果。
- 运行结束后,控制台将显示总迭代次数、最终误差平方和(SSE)以及最终质心的坐标。
详细代码实现逻辑与算法分析
本项目代码主要分为三个核心模块:环境初始化与数据准备、算法核心迭代、结果分析与可视化。
1. 数据准备与预处理
- 参数配置:设定聚类簇数 $K=3$,样本总量为300,最大迭代次数为100,收敛阈值为 $1e-4$。
- 数据合成:定义了三个不同均值($mu$)和协方差矩阵($Sigma$)的高斯分布中心,分别位于 $[2, 2]$、$[6, 6]$ 和 $[2, 7]$,生成具有一定重叠度的合成数据。
- 标准化:由于距离度量对尺度敏感,代码通过计算样本的均值和标准差,将原始数据 $X$ 转换为标准正态分布数据 $X_{norm}$。
2. K-means 算法核心实现
代码中的算法执行函数
run_kmeans 包含以下关键逻辑:
1. 随机选择第一个质心。
2. 对于后续每个质心,计算样本到当前已选最近质心的距离 $D$。
3. 根据距离的权重概率($D / sum D$)选择下一个质心,确保初始质心尽可能分散。
1.
分配步:计算所有样本与当前 $K$ 个质心的欧氏距离,将样本归类到距离最近的簇。
2.
更新步:计算每个簇内所有样本的均值,作为新的质心位置。
3.
异常处理:若某次迭代中出现空簇(即没有样本分配给该质心),算法会随机选择一个样本重新初始化该质心。
4.
收敛检查:计算新旧质心位置的平方误差变化量,若小于预设阈值
tol,则提前终止迭代。
辅助函数
dist_euclidean 利用公式 $||a-b||^2 = ||a||^2 + ||b||^2 - 2ab^T$ 实现了矩阵级运算,一次性输出所有样本到所有质心的距离矩阵。
3. 可视化与结果输出
- 反标准化:为了使可视化结果具有物理意义,代码将计算出的质心坐标和轨迹从标准化空间映射回原始数据空间。
- 图表绘制:
*
左图:展示未标记的原始数据分布。
*
右图:展示聚类结果。不同颜色的散点代表不同的簇;黄色圆点表示最终质心;黑色虚线记录了质心从初始位置到收敛位置的完整移动轨迹;“X”标记表示初始质心位置。
- 量化指标:最终输出 $SSE$(簇内误差平方和),作为评估聚类紧密程度的量化指标。
关键算法细节
- 距离度量:采用欧氏距离平方(Squared Euclidean Distance)。虽然从数学上开根号才是欧氏距离,但在比较大小时,使用平方值可以减少计算量且不改变对大小关系的判断。
- 收敛条件:算法不仅设置了最大迭代次数限制,还引入了基于质心位移变化的容差判断,确保在达到稳定状态时及时停止,节省计算资源。
- 可复现性:通过
rng(42) 固定了随机数种子,确保每次运行代码生成的随机数据和初始化结果一致,便于调试和演示。