You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

模糊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个中心的绘制代码,逻辑和上面一致

这里的细节说明:

  1. 样本绘制sod1sod5是根据隶属度矩阵U划分出来的5个类别子集——通常是把每个样本分配到隶属度最大的类别中,得到每个类的样本集合,用不同颜色的圆形标记('ob'蓝色圆、'oc'青色圆等)区分。
  2. 中心绘制:聚类中心用方形标记('xb'蓝色方、'xc'青色方等),通过Sizedata设置更大的尺寸、LineWidth加粗线条,让中心在图中更突出,方便我们观察每个类的“核心位置”。
  3. hold on的作用是保持当前图形窗口,让所有散点图绘制在同一个坐标系中,这样才能对比不同类别的分布和中心位置。

五、整体实现逻辑梳理

整个流程可以总结为4个步骤:

  1. 数据准备:确保三维数据集sod格式正确,每行代表一个三维样本点(x,y,z三个特征)。
  2. FCM聚类计算:调用fcm函数,指定聚类数为5,传入控制参数,得到聚类中心、隶属度矩阵和目标函数变化。
  3. 样本类别划分:根据隶属度矩阵U,将每个样本分配到隶属度最高的类别,生成sod1sod5五个子集。
  4. 结果可视化:用三维散点图分别绘制每个类的样本和聚类中心,直观展示聚类效果。

内容的提问来源于stack exchange,提问作者Janes

火山引擎 最新活动