模糊C均值聚类(Fuzzy c-mean clustering)代码及可视化解析问询
模糊C均值聚类(FCM)Matlab实现与三维可视化解析
一、代码整体功能概述
这段代码是基于Matlab自带的模糊C均值(Fuzzy C-Means, FCM)工具,完成对**三维数据集sod**的5类聚类划分,并通过三维散点图将聚类结果可视化——把每个类别的样本点和对应的聚类中心直观展示出来,方便我们评估聚类效果。
二、FCM核心计算模块解析
先看核心的聚类调用代码:
[centers,U,obj_fcn] = fcm(sod,5);
这行代码是整个流程的核心,调用Matlab内置的fcm函数完成聚类计算,三个返回值的含义分别是:
centers:聚类中心矩阵,每行代表一个类别的三维中心坐标(比如centers(1,:)就是第1类的x/y/z中心值)。U:模糊隶属度矩阵,行数等于样本总数,列数等于聚类数(这里是5)。矩阵中每个元素U(i,j)表示第i个样本属于第j类的隶属度,取值范围是[0,1],且每个样本的所有隶属度之和为1。obj_fcn:迭代过程中的目标函数值数组,记录了每次迭代时的目标函数结果,我们可以通过它观察算法的收敛过程——当相邻两次迭代的目标函数变化足够小时,算法就会停止。
三、关键参数含义详解
代码里给出的三个参数是FCM算法的核心控制参数(虽然原代码没显式传入fcm函数,但Matlab的fcm支持通过选项参数传入这些值):
expo = 2.0; % 模糊指数 max_iter = 100; % 最大迭代次数 min_impro = 1e-6; % 最小改进阈值
逐个解析:
expo(模糊指数):控制聚类的“模糊程度”,通常取值为2。值越大,每个样本的隶属度分布越均匀(聚类越模糊);值越接近1,聚类结果越接近硬聚类(每个样本只属于一个类别)。max_iter(最大迭代次数):设置算法的迭代上限,防止因为数据特殊导致算法无法收敛而无限循环,达到这个次数后强制停止。min_impro(最小改进阈值):收敛判断的关键指标。如果两次迭代之间目标函数的变化量小于这个值,说明聚类结果已经足够稳定,算法会提前停止迭代。
四、三维可视化模块解析
可视化部分用scatter3函数绘制三维散点图,代码逻辑是:
figure, scatter3(sod1(:,1),sod1(:,2),sod1(:,3),'ob') hold on scatter3(sod2(:,1),sod2(:,2),sod2(:,3),'oc') scatter3(sod3(:,1),sod3(:,2),sod3(:,3),'og') scatter3(sod4(:,1),sod4(:,2),sod4(:,3),'or') scatter3(sod5(:,1),sod5(:,2),sod5(:,3),'om') % 绘制聚类中心 scatter3(centers(1,1),centers(1,2),centers(1,3),'xb','Sizedata',100,'LineWidth',3) scatter3(centers(2,1),centers(2,2),centers(2,3),'xc','Sizedata',100,'LineWidth',3) % 省略第3-5个中心的绘制代码,逻辑和上面一致
这里的细节说明:
- 样本绘制:
sod1到sod5是根据隶属度矩阵U划分出来的5个类别子集——通常是把每个样本分配到隶属度最大的类别中,得到每个类的样本集合,用不同颜色的圆形标记('ob'蓝色圆、'oc'青色圆等)区分。 - 中心绘制:聚类中心用方形标记(
'xb'蓝色方、'xc'青色方等),通过Sizedata设置更大的尺寸、LineWidth加粗线条,让中心在图中更突出,方便我们观察每个类的“核心位置”。 hold on的作用是保持当前图形窗口,让所有散点图绘制在同一个坐标系中,这样才能对比不同类别的分布和中心位置。
五、整体实现逻辑梳理
整个流程可以总结为4个步骤:
- 数据准备:确保三维数据集
sod格式正确,每行代表一个三维样本点(x,y,z三个特征)。 - FCM聚类计算:调用
fcm函数,指定聚类数为5,传入控制参数,得到聚类中心、隶属度矩阵和目标函数变化。 - 样本类别划分:根据隶属度矩阵
U,将每个样本分配到隶属度最高的类别,生成sod1到sod5五个子集。 - 结果可视化:用三维散点图分别绘制每个类的样本和聚类中心,直观展示聚类效果。
内容的提问来源于stack exchange,提问作者Janes




