正在加载中...

展开本页目录
算法教程FCM-模糊 C 均值

FCM-模糊 C 均值

No.116 · 在线教程

FCM(Fuzzy C-Means)是一类典型的模糊聚类方法。与 K-Means 等硬划分算法不同,FCM 不直接把每个样本唯一分配到某一个簇,而是为每个样本分配对所有簇的隶属度,从而更适合处理簇间边界模糊、样本过渡性较强的数据结构。

FCM-模糊 C 均值

1. 方法概述

FCM(Fuzzy C-Means)是一类典型的模糊聚类方法。与 K-Means 等硬划分算法不同,FCM 不直接把每个样本唯一分配到某一个簇,而是为每个样本分配对所有簇的隶属度,从而更适合处理簇间边界模糊、样本过渡性较强的数据结构。

本项目中的 FCM-模糊 C 均值 模块采用自写的 FCM 迭代求解器,而不是简单调用外部聚类库。程序支持可选归一化、随机初始化隶属度矩阵、迭代更新聚类中心与隶属度,并输出目标函数收敛曲线、隶属度矩阵、硬划分结果以及 PCCEXB 三类聚类有效性指标。

设样本数为 \(n\),参与聚类的特征数为 \(p\),原始特征矩阵记为

$$ X=(x_{jk})_{n\times p},\quad j=1,2,\ldots,n,\ k=1,2,\ldots,p \tag{1} $$

其中每一行表示一个样本,每一列表示一个数值型特征。项目允许用户指定一个可选的样本名称列 label_col,若未指定,则程序自动生成 样本1, 样本2, \ldots, 样本n 作为样本标识。

2. 问题定义与符号说明

设需要将样本划分为 \(C\) 个模糊簇。FCM 的核心思想是同时求解:

  1. 聚类中心矩阵 \(V=\{v_i\}_{i=1}^{C}\)
  2. 隶属度矩阵 \(U=(u_{ij})_{C\times n}\)

其中 \(u_{ij}\) 表示第 \(j\) 个样本属于第 \(i\) 个簇的隶属度,满足

$$ \sum_{i=1}^{C}u_{ij}=1,\qquad 0\le u_{ij}\le 1 \tag{2} $$

项目实现中的主要符号如下。

符号 含义
\(n\) 样本数量
\(p\) 特征维数
\(C\) 聚类数 n_clusters
\(x_j\) 第 \(j\) 个样本特征向量
\(v_i\) 第 \(i\) 个聚类中心
\(u_{ij}\) 样本 \(x_j\) 对簇 \(i\) 的隶属度
\(m\) 模糊系数 fuzziness
\(t\) 迭代轮次
\(\varepsilon\) 收敛阈值 epsilon
\(J^{(t)}\) 第 \(t\) 轮目标函数值

3. 核心数学模型

3.1 目标函数

FCM 通过最小化加权簇内平方距离来求解聚类中心与隶属度。项目实现中的目标函数为

$$ J(U,V)=\sum_{i=1}^{C}\sum_{j=1}^{n}u_{ij}^{m}\,\|x_j-v_i\|_2^2 \tag{3} $$

其中 \(m>1\) 为模糊系数。当 \(m\) 越接近 1 时,聚类结果越接近硬划分;当 \(m\) 增大时,样本对多个簇的隶属度会更加平滑。

3.2 聚类中心更新

在隶属度矩阵 \(U\) 已知时,第 \(i\) 个聚类中心按照加权平均更新:

$$ v_i=\frac{\sum_{j=1}^{n}u_{ij}^{m}x_j}{\sum_{j=1}^{n}u_{ij}^{m}} \tag{4} $$

这与代码中的

$$ V=\frac{U^{\circ m}X}{\sum_{j=1}^{n}u_{ij}^{m}} \tag{5} $$

是一致的,其中 \(U^{\circ m}\) 表示对隶属度矩阵逐元素取 \(m\) 次幂。

3.3 距离计算

程序采用欧氏距离度量样本与聚类中心之间的距离:

$$ d_{ij}=\|x_j-v_i\|_2 \tag{6} $$

在实现中,先构造中心与样本的差值张量,再按特征维求二范数,得到距离矩阵 \(D=(d_{ij})_{C\times n}\)。

3.4 隶属度更新

当所有距离均严格大于 0 时,隶属度按照标准 FCM 公式更新:

$$ u_{ij}=\frac{1}{\sum_{k=1}^{C}\left(\frac{d_{ij}}{d_{kj}}\right)^{\frac{2}{m-1}}} \tag{7} $$

等价地,也可写为

$$ u_{ij}=\frac{d_{ij}^{-\frac{2}{m-1}}}{\sum_{k=1}^{C}d_{kj}^{-\frac{2}{m-1}}} \tag{8} $$

项目实现对零距离情形做了显式处理:若样本 \(x_j\) 与某些聚类中心完全重合,即存在 \(d_{ij}=0\),则不再使用式(7);而是把该样本的隶属度平均分配给所有零距离簇:

$$ u_{ij}= \begin{cases} \dfrac{1}{q_j}, & d_{ij}=0\\[4pt] 0, & d_{ij}>0 \end{cases} \tag{9} $$

其中 \(q_j\) 表示与样本 \(x_j\) 距离为 0 的聚类中心个数。这个处理与代码中的 _update_membership() 完全一致,可避免把零距离简单替换为极小数后产生伪模糊分配。

3.5 初始化与收敛准则

程序不是初始化聚类中心,而是直接随机初始化隶属度矩阵 \(U^{(0)}\),并对每一列做归一化处理:

$$ \sum_{i=1}^{C}u_{ij}^{(0)}=1 \tag{10} $$

随后迭代更新中心、距离和隶属度,并记录每轮目标函数值 \(J^{(t)}\)。若相邻两轮目标函数改变量满足

$$ \left|J^{(t)}-J^{(t-1)}\right|<\varepsilon \tag{11} $$

则提前停止;否则继续迭代,直到达到最大迭代次数 max_iter

3.6 硬划分结果

虽然 FCM 本质上输出的是模糊隶属度,但程序为了方便结果展示,还会基于最大隶属度生成硬划分标签:

$$ \hat y_j=\arg\max_{1\le i\le C}u_{ij} \tag{12} $$

实现中为了便于 Excel 展示,最终输出的簇编号使用 1,2,\ldots,C,而不是从 0 开始编号。同时还会输出每个样本的最大隶属度

$$ u_j^{\max}=\max_{1\le i\le C}u_{ij} \tag{13} $$

用于描述该样本被当前硬划分结果吸收的确定性强弱。

3.7 聚类有效性指标

项目当前输出三种有效性指标。

Partition Coefficient(PC) $$ \mathrm{PC}=\frac{1}{n}\sum_{j=1}^{n}\sum_{i=1}^{C}u_{ij}^2 \tag{14} $$

PC 越大,说明隶属度分配越集中。

Classification Entropy(CE) $$ \mathrm{CE}=-\frac{1}{n}\sum_{j=1}^{n}\sum_{i=1}^{C}u_{ij}\ln(u_{ij}) \tag{15} $$

CE 越小,说明模糊划分越清晰。

Xie-Beni 指数(XB) $$ \mathrm{XB}= \frac{\sum_{i=1}^{C}\sum_{j=1}^{n}u_{ij}^{m}\|x_j-v_i\|_2^2} {n\cdot \min\limits_{i\ne k}\|v_i-v_k\|_2^2} \tag{16} $$

XB 越小,通常表示簇内更紧凑、簇间更分离。程序中若聚类中心之间出现完全重合,则会把对应中心间距离置为无穷的保护值后再取最小非零中心距离。

4. 数据预处理与结果反变换

项目支持三种预处理方式:

  1. none:不做缩放,直接使用原始数值特征;
  2. minmax:对每个特征执行 Min-Max 归一化;
  3. zscore:对每个特征执行 Z-score 标准化。

Min-Max 归一化形式为

$$ z_{jk}=\frac{x_{jk}-x_k^{\min}}{x_k^{\max}-x_k^{\min}} \tag{17} $$

Z-score 标准化形式为

$$ z_{jk}=\frac{x_{jk}-\mu_k}{\sigma_k} \tag{18} $$

程序在 Excel 中同时输出:

  1. Centers:预处理空间中的聚类中心;
  2. Centers_Original:反变换回原始尺度后的聚类中心。

因此论文中若需要解释“各簇在原始指标上的中心水平”,应优先使用 Centers_Original

5. 算法流程

结合当前项目实现,FCM-模糊 C 均值 的完整流程如下:

  1. 读取数据文件,并自动识别全部可转换为数值的列。
  2. 用户在“特征设置”页中选择一个可选的样本名称列 label_col,并从数值列中勾选参与聚类的特征列。
  3. 程序检查所选特征列是否存在非数值、空值或常数列。
  4. 根据设置的 normalize 方式对特征矩阵进行预处理。
  5. 随机初始化隶属度矩阵 \(U^{(0)}\),并按式(10) 对每个样本的隶属度归一化。
  6. 迭代执行中心更新、距离计算、目标函数计算与隶属度更新,直到满足式(11) 或达到 max_iter
  7. 根据最大隶属度生成硬划分结果,并计算 PCCEXB 指标。
  8. 绘制目标函数收敛曲线与聚类散点图,导出 Excel 结果与复现脚本。

6. 关键参数说明

6.1 n_clusters

聚类数 C,界面允许范围为 250,默认值为 3。由于 FCM 是显式指定簇数的算法,因此该参数直接决定最终中心个数与隶属度矩阵维数。

6.2 fuzziness

模糊系数 m,界面允许范围为 1.110.0,默认值为 2.0。当 m 增大时,隶属度分配更模糊;当 m 接近 1 时,聚类更接近硬划分。程序在核心计算中要求 m>1

6.3 max_iter

最大迭代次数,界面允许范围为 101000,默认值为 100。若在该次数之前未满足收敛条件,程序会以最后一次迭代结果作为输出。

6.4 epsilon

目标函数收敛阈值,界面允许范围为 1e-81e-2,默认值为 1e-5。该值越小,算法通常会迭代更久,但结果也更接近数值收敛。

6.5 normalize

预处理方式,界面映射关系如下:

  • none
  • Min-Maxminmax
  • Z-Scorezscore

当特征量纲差异较大时,通常建议启用 minmaxzscore,否则距离计算会被大尺度特征主导。

6.6 random_state

随机种子。界面中输入 -1 表示随机初始化,程序内部会把其转为 None;输入具体整数时,则用该整数控制隶属度矩阵初始化,从而提升结果可复现性。

7. 评价指标与输出结果解释

程序导出的 Excel 文件固定命名为 fcm_results.xlsx,位于形如

results/FCM-模糊 C 均值分析结果_<时间戳>/

的结果目录下。当前实现会输出以下工作表:

  1. Parameters:参数配置与最终目标函数值。
  2. RawData:原始数据表。
  3. ProcessedData:归一化或标准化后的数据。
  4. Centers:预处理空间中的聚类中心。
  5. Centers_Original:反变换到原始尺度的聚类中心。
  6. Membership:完整隶属度矩阵、最大隶属度与硬划分结果。
  7. Labels:样本名称、硬划分结果、最大隶属度。
  8. Objective:目标函数随迭代变化的历史序列。
  9. ValidityPCCEXB 三项指标。
  10. ClusterSummary:各硬划分簇的样本数量。
  11. Charts:图表路径索引。

同时,程序会在结果目录下生成:

  1. plots/objective_curve.png
  2. plots/cluster_scatter.png
  3. repro_fcm_模糊_c_均值.py
  4. repro_inputs/ 下的复现输入文件

从结果解释角度看:

  1. 最大隶属度 越接近 1,说明样本对某一簇的归属越明确。
  2. PC 高、CE 低通常意味着划分更清晰。
  3. XB 越小通常表示中心分离度更好、簇内紧凑性更高。
  4. Objective 曲线若较快趋于平稳,说明算法已达到数值收敛。

8. 论文写作模板

8.1 方法描述模板

可将当前项目实现表述为:

“本文采用模糊 C 均值(FCM)方法对样本进行模糊聚类分析。首先对所选数值特征进行预处理,并构造初始隶属度矩阵。随后在给定聚类数 \(C\) 和模糊系数 \(m\) 的条件下,通过交替更新聚类中心与样本隶属度,最小化加权簇内平方距离目标函数。算法迭代直至相邻两轮目标函数变化小于设定阈值或达到最大迭代次数。最终输出样本对各簇的隶属度矩阵、基于最大隶属度的硬划分结果,以及聚类有效性指标 PC、CE 与 XB,用于评价聚类结构的清晰度与紧凑性。”

若需要更贴近本项目工程实现,还可补充说明:本文实现支持 noneminmaxzscore 三种预处理模式,并同时输出标准化空间与原始尺度下的聚类中心。

8.2 结果解释模板

结果部分可写为:FCM 不仅给出样本的最终硬划分标签,还同时输出样本对各簇的隶属度水平。若某些样本在多个簇上的隶属度接近,则说明其边界属性较强;若 PC 较高、CE 与 XB 较低,则说明聚类结构相对清晰且簇内更紧凑。

8.3 表格标题模板

表题可写为:FCM 隶属度矩阵与聚类有效性指标汇总表。

8.4 图表题注模板

图注可写为:FCM 聚类结果及样本隶属度分布图。

8.5 表格示例

建议列名:样本编号、硬划分标签、各簇隶属度、PC、CE、XB、聚类中心。

9. 实现说明与注意事项

  1. FCM 适用于簇边界不清晰、样本可能同时接近多个中心的模糊聚类问题。
  2. 当前实现要求所选特征列全部为数值型,且不能是常数列。
  3. 数据上传阶段只要求“至少存在一个数值列”,但真正进入计算前仍需在特征设置页明确选择特征列。
  4. 若样本数少于聚类数,程序会直接报错,因此小样本场景下需要适当降低 n_clusters
  5. 由于 FCM 本质上是基于距离和中心的分区算法,因此对初始隶属度和预处理方式较敏感,建议在论文中补充不同随机种子或不同 C 取值下的稳健性比较。
  6. 当前散点图仅使用处理后数据的前两维展示聚类结果,不能完全代表高维空间中的真实簇结构。
  7. 结果页仅显示前 50 行隶属度矩阵,完整隶属度信息应以导出的 Excel 文件为准。
  8. 当数据中存在与某中心完全重合的样本时,程序会触发零距离特判并均分隶属度,这一点与教科书中默认“距离均非零”的推导略有不同,论文方法说明中可以视需要注明。

10. 论文写作建议

论文中建议不要只给最终硬划分标签,而应同时展示:

  1. 聚类中心;
  2. 模糊隶属度矩阵摘要;
  3. 隶属度最高的若干典型样本;
  4. FPC、SSE 等评价指标。

这样更能体现 FCM 与硬聚类的差异。若研究需要强调样本在多个簇之间的过渡特征,最好在正文中单独解释高隶属度不明显的边界样本。

11. 单篇终审补充

11.1 图题与表题对齐建议

当前 FCM 模块真实导出工作簿包含:

  • Parameters
  • RawData
  • ProcessedData
  • Centers
  • Centers_Original
  • Membership
  • Labels
  • Objective
  • Validity
  • ClusterSummary
  • Charts

其中 ClusterSummaryValidity 更适合放论文主文,MembershipCenters_Original 更适合结果细节或附录。Objective 页表示目标函数收敛轨迹,不建议在论文里误写成“理论证明表”。

图文件位于结果目录 plots/ 子目录,当前程序生成:

  • objective_curve.png
  • cluster_scatter.png

因此图题建议写成“FCM 目标函数收敛曲线图”“FCM 聚类散点图”。不要写成隶属度热力图,因为当前软件没有单独导出该图。

11.2 终审说明

这篇文档最需要守住的实现口径,是 FCM 的核心输出并不是 Labels,而是 Membership 隶属度矩阵。Labels 只是按最大隶属度得到的派生硬标签,因此论文如果只展示 Labels,会把 FCM 写得过于接近 KMeans。

另外,当前 repro 脚本已经统一把输入复制到 repro_inputs/ 下,并在脚本内用相对路径引用。因此这篇可以明确写“支持可移植复现实验”;但论文里仍应避免把复现说成“文件逐字节一致”,更准确的说法是“可重建同构结果工作簿与图表”。

11.3 全量强化补充

本次全量强化绑定的真实结果目录为 具体的算法3/聚类与降维/FCM-模糊 C 均值/results/FCM-模糊 C 均值分析结果_20260329_171242。该目录内主工作簿为 fcm_results.xlsx,实际工作表为 ParametersRawDataProcessedDataCentersCenters_OriginalMembershipLabelsObjectiveValidityClusterSummaryCharts。这套实物输出与前文总结一致,说明当前 FCM 结果链确实保留了隶属度矩阵与目标函数轨迹,而不是只剩硬标签结果。

图件位于 plots/ 下,真实文件为 objective_curve.pngcluster_scatter.png。目录内同时存在 repro_fcm_模糊_c_均值.pyrepro_inputs/window2_fcm_baseline_input.csv。脚本当前真实参数写法为 INPUT_FILE = 'repro_inputs/window2_fcm_baseline_input.csv'OUTPUT_FILE = 'fcm_results.xlsx',并绑定 n_clusters = 3fuzziness = 2.0max_iter = 100epsilon = 1e-05normalize = 'none'random_state = 11

因此 FCM 当前已经形成标准的新框架复现链:主结果工作簿、图目录、相对路径输入副本和同名 repro 脚本都在同一轮目录内。论文若讨论可复现性,可以直接引用这一结果目录,而无需再借用旧时间戳目录中的证据。

12. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/聚类与降维/FCM-模糊 C 均值/results/FCM-模糊 C 均值分析结果_20260329_171242
  • 正文应围绕 ParametersRawDataProcessedDataCentersCenters_OriginalMembershipLabelsObjectiveValidityClusterSummaryCharts 来写。
  • 图证应对应 objective_curve.pngcluster_scatter.png,并把隶属度矩阵与目标函数收敛过程写清。
  • 复现脚本应按 repro_fcm_模糊_c_均值.py + repro_inputs/window2_fcm_baseline_input.csv 的口径说明。