基于MATLAB的标准K均值聚类算法实现
项目简介
本项目提供了一套完整、准确且经过验证的K均值(K-Means)聚类算法的MATLAB代码实现。该项目旨在通过清晰的代码结构演示无监督学习中最基础的聚类算法原理。程序不仅包含核心算法的底层实现,还内置了包含三个高斯分布簇的模拟数据生成模块,以及详细的结果评估与可视化功能。
代码逻辑严谨,涵盖了初始化、距离计算、簇分配、中心更新及收敛检测等全套流程,并特别处理了空簇等边缘情况,确保算法的鲁棒性。
功能特性
- 完整算法实现:不依赖MATLAB内置的
kmeans函数,而是从底层编写了完整的迭代逻辑,适合算法学习与研究。 - 合成数据生成:内置多维高斯分布数据生成器,自动生成具有清晰结构的三簇测试数据,无需额外数据集即可运行。
- 结果可复现:通过设定随机数种子,确保每次运行的数据生成与聚类结果完全一致。
- 可视化分析:
*
聚类散点图:展示最终的聚类效果,不同簇使用不同颜色区分。
*
中心轨迹追踪:在图中绘制聚类中心从初始位置到最终收敛位置的移动轨迹。
*
收敛曲线:绘制目标函数(SSE)随迭代次数的变化曲线,直观展示算法收敛过程。
- 鲁棒性设计:包含对“空簇”(某一类未分配到任何样本)的异常处理机制。
系统要求
- MATLAB R2016a 或更高版本
- Statistics and Machine Learning Toolbox(用于
mvnrnd函数生成高斯分布数据)
使用方法
- 下载本项目代码。
- 在MATLAB中打开项目文件夹。
- 直接运行
main.m 脚本。 - 程序将在命令行输出迭代过程信息,并弹出一个包含两幅子图的结果窗口。
详细实现逻辑与算法分析
本项目主要由主控流程和核心算法函数两部分组成,具体逻辑如下:
1. 数据生成与预处理
程序首先清空工作环境并固定随机种子(Seed=42)。接着生成模拟测试数据:
- 构建3个不同的高斯分布(Gaussian Distributions),分别定义了不同的均值向量($mu$)和协方差矩阵($Sigma$)。
- 每个分布生成100个样本,共计300个样本。
- 将所有数据合并后随机打乱顺序,模拟真实的混合数据集。
2. 核心算法参数
- 聚类簇数 (K):设置为3。
- 最大迭代次数:设置为100次,防止死循环。
- 收敛阈值 (tol):设置为 $1 times 10^{-6}$,用于判断聚类中心是否稳定。
3. K-Means 算法流程 (run_kmeans 函数)
这是算法的核心实现部分,具体步骤如下:
#### A. 初始化
采用随机样本选择法。从原始数据集中随机抽取 $K$ 个样本点直接作为初始聚类中心。
#### B. 迭代过程 (Assignment & Update)
算法进入主循环,重复以下步骤直到收敛:
- 簇分配 (Assignment Step):
* 计算数据集中每个样本点到当前 $K$ 个聚类中心的欧氏距离平方。
* 通过比较距离,将每个样本分配给距离最近的聚类中心。
* 计算当前的
簇内误差平方和 (SSE),用于评估聚类效果和绘制收敛曲线。
- 中心更新 (Update Step):
* 计算每个簇内所有样本的均值,将该均值作为新的聚类中心。
*
空簇处理:如果在某次迭代中,某个聚类中心没有被分配任何样本,算法会发出警告,并随机选择一个数据点重新初始化该中心,防止算法崩溃。
- 收敛性检查:
* 计算聚类中心位置相对于上一次迭代的移动距离(Frobenius范数)。
* 如果移动距离小于设定的阈值 (
tol),则认为算法收敛,提前终止循环。
4. 结果可视化
程序执行完毕后,会生成一个包含两个子图的图形窗口:
* 用不同颜色显示属于不同簇的数据点。
* 使用黑色叉号 (
x) 和圆圈 (
o) 高亮显示最终的聚类中心。
* 使用虚线绘制从初始点到最终收敛点的
中心移动轨迹,直观展示算法的寻优路径。
* X轴为迭代次数,Y轴为SSE(簇内误差平方和)。
* 通常呈快速下降趋势,随着迭代进行趋于平稳,证明了算法的有效收敛。
关键代码细节
- 向量化计算:在计算距离时使用了
bsxfun 函数(或MATLAB的高版本广播机制),避免了多重for循环,提高了计算效率。 - 历史记录:利用
history 结构体记录了每次迭代的 SSE 值和中心坐标,专门用于后续的轨迹绘制和收敛分析。