FCMDEMO: 模糊C均值聚类交互式演示系统
项目简介
本项目是一个基于 MATLAB 开发的单一窗口图形用户界面(GUI)应用程序,旨在直观地演示和可视化模糊C均值(Fuzzy C-Means, FCM)聚类算法的内部执行过程。通过交互式的操作面板,用户可以生成不同的二维数据集,调整聚类参数,并实时观察算法如何通过迭代优化聚类中心和隶属度矩阵,从而实现对数据的自动划分。该系统非常适合用于教学演示、算法行为分析以及验证FCM算法在不同数据分布下的性能。
功能特性
本项目集成了以下核心功能:
- 交互式GUI界面:采用简洁的左右布局,左侧为可视化绘图区,右侧为参数控制与状态显示区。
- 多样的预设数据集:内置5种典型的二维数据分布生成器,用于测试算法在不同场景下的表现:
*
三簇高斯分布:模拟典型的团状聚类结构。
*
同心圆环结构:测试算法在非凸形状下的表现(包含坐标变换)。
*
双月牙形状:测试算法处理交错非线性数据的能力。
*
随机均匀分布:测试算法在无明显聚类结构数据上的行为。
*
四角分布:模拟分散在四个角落的独立簇。
- 动态参数配置:用户可以自定义聚类数量(Cluster Number, C),系统包含输入验证机制,限制输入范围为 2-10 的整数。
- 实时算法动画:
* 动态展示聚类中心的移动轨迹。
* 根据当前最大的隶属度实时更新数据点的分类颜色。
* 在界面上实时显示当前的迭代次数、目标函数值(J)以及收敛误差(最大全矩阵变化量)。
- 状态反馈与重置:提供文本区域显示详细的运行状态,并设有重置功能以恢复初始视图。
- 鲁棒性设计:包含对参数输入的错误检查(防止非数字或越界输入)以及防止重复点击运行的逻辑。
系统要求
- MATLAB R2016a 或更高版本(建议)。
- Statistics and Machine Learning Toolbox(用于生成多变量正态分布数据
mvnrnd)。
使用方法
- 启动程序:在 MATLAB 命令窗口中直接运行主函数。
- 选择数据:在右侧控制面板的“选择数据集”下拉菜单中选择一种数据分布类型(如“三簇高斯分布”)。选择后,左侧绘图区会自动刷新并显示原始数据。
- 设置参数:在“聚类数量 (C)”输入框中输入期望的聚类数目(默认为 3,建议范围 2-10)。
- 开始分析:点击“Start (开始聚类)”按钮。
* 程序将禁用部分控件以防干扰。
* 左侧绘图区将开始播放聚类动画,数据点颜色会随归属变化,“X”形标记代表聚类中心。
* 右侧下方的文本域将滚动显示迭代过程中的 $J$ 值变化。
- 查看结果:当满足收敛条件(默认误差 < 1e-5)或达到最大迭代次数(100次)后,动画停止,文本域显示最终统计信息。
- 重置:点击“Reset (重置数据)”按钮可清除聚类结果,恢复到原始数据分布视图。
代码实现与算法细节
本项目的核心逻辑全部封装在一个主函数文件中,主要由界面构建、数据生成、算法核心与回调处理四部分组成。
1. 界面构建与布局
系统使用 MATLAB 的
uicontrol 函数家族构建。布局设计为固定比例:
- 绘图区:使用
axes 对象展示二维散点图,开启网格以便于观察坐标。 - 控制面板:使用
frame 作为背景,包含 popupmenu(下拉选择)、edit(文本输入)、pushbutton(按钮)和 text(标签与状态显示)。所有控件通过 Normalized 单位定位,以适应窗口大小调整。
2. 数据生成逻辑 (generate_data)
系统通过内部辅助函数依据用户的选择动态生成 300 个样本点 (
N_samples = 300)。为了保证演示的可重复性,代码使用了与数据类型挂钩的随机数种子 (
rng(42 + data_type))。
- 高斯分布:使用
mvnrnd 生成三个均值和协方差矩阵不同的正态分布簇。 - 几何形状(圆环/月牙):通过极坐标变换或三角函数生成特定几何形状,并叠加高斯噪声模拟真实数据。
- 坐标处理:部分数据集(如圆环和月牙)在生成后进行了平移操作,使其位于第一象限,便于绘图展示。
3. FCM 算法核心 (run_fcm_algorithm)
这是系统的核心处理函数,完整实现了模糊C均值算法的标准流程,并嵌入了可视化更新逻辑。
- 初始化:随机生成 $C times N$ 的隶属度矩阵 $U$,并进行归一化处理,确保每列之和为1。
- 参数设定:
* 模糊指数 $m = 2.0$。
* 最大迭代次数
max_iter = 100。
* 收敛阈值
epsilon = 1e-5。
1.
计算中心:基于当前的隶属度矩阵 $U$ 计算新的聚类中心 $V$。
2.
计算距离:计算所有样本点到所有聚类中心的欧氏距离平方。
3.
更新隶属度:根据距离矩阵更新 $U$。代码中加入了微小量
1e-10 以防止除零错误。
4.
计算目标函数:计算加权平方误差和 $J$,用于评估聚类效果。
5.
收敛判断:比较前后两次 $U$ 矩阵的最大绝对差值。
* 在循环内部,使用
drawnow limitrate 强制刷新 GUI。
* 通过
pause(0.1) 人为引入延迟,使用户肉眼能跟上迭代过程。
*
着色策略:为了视觉清晰,绘图时采用“硬分类”显示,即根据每个点在 $U$ 中最大的隶属度值确定其所属簇颜色。
*
动态更新:利用图形对象的句柄(
hScatter,
hCenters)直接更新
XData and
YData 属性,避免了重复调用
plot 导致的闪烁和性能下降。
4. 交互回调机制
- Start 按钮回调:主要负责参数校验。如果用户输入非整数或超出 2-10 的范围,会弹出
errordlg 错误提示框并终止运行。并在算法运行期间禁用按钮,防止重入。 - Dataset 选择回调:触发数据重新生成和视图重置。