跳到主要内容

模糊综合评价

模糊综合评价(Fuzzy Comprehensive Evaluation, FCE)是数学建模中处理评价类问题的主力方法之一:它把"边界不清"的定性评语(如"教学质量好""环境质量优")用隶属度量化,再通过模糊合成把多个因素的模糊信息汇总成一个综合评价向量。它特别擅长处理"指标是定性打分的、等级之间没有明确分界"的评价场景,常与层次分析法(AHP)、熵权法、TOPSIS 组合使用,是竞赛评价类论文中出现频率最高的算法之一。本文从模糊数学基础、模型五要素、合成算子、评价指标、可视化到可运行代码,完整梳理模糊综合评价的竞赛实战用法。

一、算法含义

1.1 通俗理解:从"85 分算不算优秀"说起

先看一个竞赛中常见的场景:要评价一位教师的教学质量,通常有"教学内容、教学方法、教学态度、教学效果"四个方面(因素),每个方面给出"优秀 / 良好 / 中等 / 及格 / 不及格"五个等级(评语)。问题来了:

  • 一位教师某班及格率 92%,这个指标算"优秀"还是"良好"?如果硬性规定"90 分以上算优秀",那 89.9 分与 90 分只差 0.1 分,却一个"优秀"一个"良好",这显然不符合人的直觉;
  • 专家投票时,20 位专家有 15 位投"优秀"、3 位投"良好"、2 位投"中等",这个"多数派"结论能有多确定?

经典集合论的回答是"非此即彼":元素要么属于集合、要么不属于。这种二值逻辑用一个特征函数刻画:

χA(x)={1,xA0,xA\chi_A(x) = \begin{cases} 1, & x \in A \\ 0, & x \notin A \end{cases}

模糊数学(L. A. Zadeh 于 1965 年提出)把"属于"改成一个介于 0 和 1 之间的数——隶属度 μA(x)[0,1]\mu_A(x) \in [0,1],表示"xx 在多大程度上属于集合 AA"。于是:

  • 及格率 92% 可以"以 0.7 的程度属于优秀、以 0.3 的程度属于良好",即 μ优秀(92)=0.7\mu_{\text{优秀}}(92) = 0.7μ良好(92)=0.3\mu_{\text{良好}}(92) = 0.3
  • 15/20 位专家投"优秀",就把"教学内容属于优秀"的隶属度定为 15/20=0.7515/20 = 0.75

模糊综合评价做的事情,就是把每个因素对每个等级的隶属度(构成隶属度矩阵 RR)、每个因素的重要性权重(构成权重向量 AA),用模糊合成算子"合成"成一个最终的评价向量 BB——即"评价对象整体上对每个等级的隶属程度",再据此下结论。整个过程可以用一句话概括:

隶属度矩阵 R 记录"单个因素落在各等级的模糊程度",权重 A 记录"各因素谁更重要",模糊合成 B = A ∘ R 把它们揉成一个总评价。

1.2 模糊数学基础:隶属度与隶属函数

隶属函数 μA(x)\mu_A(x) 把一个具体数值 xx(指标值、打分、票数比例等)映射为对模糊集合 AA 的隶属度。竞赛中常用的隶属函数有三类形状(以 100 分制指标、等级"优秀/良好/中等/及格/不及格"为例,相邻等级间隔 10 分):

  • 升半梯形(常用于最高等级"优秀"):

μ优秀(x)={0,x<85x8510,85x<951,x95\mu_{\text{优秀}}(x) = \begin{cases} 0, & x < 85 \\ \dfrac{x - 85}{10}, & 85 \le x < 95 \\ 1, & x \ge 95 \end{cases}

  • 降半梯形(常用于最低等级"不及格"):

μ不及格(x)={1,x<5565x10,55x<650,x65\mu_{\text{不及格}}(x) = \begin{cases} 1, & x < 55 \\ \dfrac{65 - x}{10}, & 55 \le x < 65 \\ 0, & x \ge 65 \end{cases}

  • 中间梯形(常用于"良好/中等/及格"这类中间等级,以"良好"为例):

μ良好(x)={0,x<75x7510,75x<8595x10,85x<950,x95\mu_{\text{良好}}(x) = \begin{cases} 0, & x < 75 \\ \dfrac{x - 75}{10}, & 75 \le x < 85 \\ \dfrac{95 - x}{10}, & 85 \le x < 95 \\ 0, & x \ge 95 \end{cases}

  • 高斯型(曲线光滑,多用于指标取中间值最优的情形):

μ(x)=exp[(xcσ)2]\mu(x) = \exp\left[-\left(\frac{x - c}{\sigma}\right)^2\right]

三个重要性质:

  1. 相邻等级的隶属曲线互相重叠x=92x = 92μ优秀=0.7\mu_{\text{优秀}} = 0.7μ良好=0.3\mu_{\text{良好}} = 0.3、其余为 0——同一个值同时"部分属于"两个相邻等级,这正是"模糊"二字的含义;
  2. 模糊划分(partition of unity):上面这组梯形隶属函数对任意 x[0,100]x \in [0,100] 都有 jμvj(x)=1\sum_{j} \mu_{v_j}(x) = 1,即各等级隶属度之和恒为 1,这保证后续评价向量天然"行归一化";
  3. 隶属函数形状由问题决定:拐点(85、95 等)和斜率(这里都是 10 分宽)是人为设定的,需要根据评分标准的语义在论文中交代清楚。

1.3 模糊综合评价的五个要素

一个完整的模糊综合评价模型由以下五个要素构成(符号定义统一见第五节):

要素 1:因素集(指标集)UU

U={u1,u2,,un}U = \{u_1, u_2, \dots, u_n\}

即评价从哪些方面进行。如教学质量评价:U={教学内容,教学方法,教学态度,教学效果}U = \{ \text{教学内容}, \text{教学方法}, \text{教学态度}, \text{教学效果} \},共 n=4n = 4 个因素。

要素 2:评语集(等级集)VV

V={v1,v2,,vm}V = \{v_1, v_2, \dots, v_m\}

即评价结果的档次划分。如 V={优秀,良好,中等,及格,不及格}V = \{ \text{优秀}, \text{良好}, \text{中等}, \text{及格}, \text{不及格} \},共 m=5m = 5 个等级。评语集一般取 3~5 个等级:太少区分度不足,太多(如 7 级以上)专家难以区分相邻等级。

要素 3:权重向量 AA

A=(a1,a2,,an),ai0,i=1nai=1A = (a_1, a_2, \dots, a_n), \quad a_i \ge 0, \quad \sum_{i=1}^{n} a_i = 1

aia_i 表示第 ii 个因素的重要程度。权重通常由 AHP(层次分析法) 给出(构造判断矩阵 → 求特征向量 → 一致性检验),也可以用熵权法(客观数据定权)或两者组合赋权。本文第六节示例中的权重 A=(0.4231,0.2274,0.1222,0.2274)A = (0.4231, 0.2274, 0.1222, 0.2274) 即由 AHP 方根法算出。

要素 4:单因素评价矩阵(隶属度矩阵)RR

R=(r11r12r1mr21r22r2mrn1rn2rnm)R = \begin{pmatrix} r_{11} & r_{12} & \cdots & r_{1m} \\ r_{21} & r_{22} & \cdots & r_{2m} \\ \vdots & \vdots & & \vdots \\ r_{n1} & r_{n2} & \cdots & r_{nm} \end{pmatrix}

iiri=(ri1,,rim)r_i = (r_{i1}, \dots, r_{im})ii 个因素的单因素评价向量:只从这个因素看,对象属于各等级的隶属度。每行必须归一化jrij=1\sum_{j} r_{ij} = 1。竞赛中 RR 的三种构造方式:

构造方式做法适用情形
专家投票比例法KK 位专家投票,rij=投 vj 的人数/Kr_{ij} = \text{投 } v_j \text{ 的人数}/K定性指标(本文主例,20 位专家投票)
隶属函数法指标实测值 xix_i 代入各等级隶属函数,rij=μvj(xi)r_{ij} = \mu_{v_j}(x_i)定量指标(本文小例,及格率 92%)
频率统计法大样本调查,rij=样本落在等级 vj 的频率r_{ij} = \text{样本落在等级 } v_j \text{ 的频率}问卷/量表数据

要素 5:模糊合成算子 \circ

AARR 合成为总评价向量的运算规则。常用的有三种,见 1.5 节。

1.4 一级模糊综合评价模型

单层(一级)模糊综合评价的模型非常简洁——权重向量与隶属度矩阵做一次模糊合成:

B=AR=(a1,,an)(r11r1mrn1rnm)=(b1,b2,,bm)B = A \circ R = (a_1, \dots, a_n) \circ \begin{pmatrix} r_{11} & \cdots & r_{1m} \\ \vdots & & \vdots \\ r_{n1} & \cdots & r_{nm} \end{pmatrix} = (b_1, b_2, \dots, b_m)

其中 bjb_j 是评价对象整体上对第 jj 个等级的隶属度,BB 称为综合评价向量。以本文示例(教学质量评价)为例,采用加权平均型算子时:

B=(0.4231,0.2274,0.1222,0.2274)(0.750.150.10000.500.350.100.0500.750.200.05000.600.300.050.050)B = (0.4231, 0.2274, 0.1222, 0.2274) \cdot \begin{pmatrix} 0.75 & 0.15 & 0.10 & 0 & 0 \\ 0.50 & 0.35 & 0.10 & 0.05 & 0 \\ 0.75 & 0.20 & 0.05 & 0 & 0 \\ 0.60 & 0.30 & 0.05 & 0.05 & 0 \end{pmatrix}

第一分量手算演示(加权平均型 bj=iairijb_j = \sum_i a_i r_{ij}):

b1=0.4231×0.75+0.2274×0.50+0.1222×0.75+0.2274×0.60=0.6591b_1 = 0.4231 \times 0.75 + 0.2274 \times 0.50 + 0.1222 \times 0.75 + 0.2274 \times 0.60 = 0.6591

同理可得 B=(0.6591,0.2357,0.0825,0.0227,0)B = (0.6591, 0.2357, 0.0825, 0.0227, 0),分量和为 1。解读:该教师的教学质量"以 65.91% 的程度属于优秀、23.57% 属于良好、8.25% 属于中等、2.27% 属于及格、0% 属于不及格"。

1.5 常用模糊合成算子(三种)

合成算子 \circ 的选择直接影响结果,是模糊综合评价的核心设计决策。设 aia_i 为权重、rijr_{ij} 为隶属度,三种常用算子如下:

① 主因素决定型 M(,)M(\wedge, \vee)(取小取大)

bj=i=1n(airij)=maximin(ai,rij)b_j = \bigvee_{i=1}^{n} \left( a_i \wedge r_{ij} \right) = \max_{i} \min(a_i, r_{ij})

含义:先对每个因素"取小"(min(ai,rij)\min(a_i, r_{ij}),相当于权重给隶属度封顶),再跨因素"取大"(只保留最突出的那个因素)。缺点:大量投票信息被丢弃,BB 的分量和往往小于 1,结论偏保守。本文示例中 M(,)M(\wedge,\vee) 给出 B=(0.4231,0.2274,0.1000,0.0500,0)B = (0.4231, 0.2274, 0.1000, 0.0500, 0),分量和仅 0.8005——"优秀"分量 0.6591 被权重上限 0.4231 直接卡掉了一截。

② 主因素突出型 M(,)M(\cdot, \vee)(乘积取大)

bj=i=1n(airij)=maxi(airij)b_j = \bigvee_{i=1}^{n} \left( a_i \cdot r_{ij} \right) = \max_i \left( a_i \, r_{ij} \right)

含义:用乘法代替取小(权重不再"封顶"而是缩放),但最后仍只取最大值,次要因素的信息依然被忽略。比 M(,)M(\wedge,\vee) 精细一些,但仍只反映"最突出因素"。

③ 加权平均型 M(,+)M(\cdot, +)(乘加)——竞赛最常用

bj=i=1nairijb_j = \sum_{i=1}^{n} a_i \, r_{ij}

含义:权重与隶属度全部参与运算,既体现加权平均、又让每个因素的投票都进入结果。优点:信息利用最充分,BB 分量和恒为 1(当 RR 行归一化、AA 归一化时),结果最均衡可信。本文示例中 M(,+)M(\cdot,+) 给出 B=(0.6591,0.2357,0.0825,0.0227,0)B = (0.6591, 0.2357, 0.0825, 0.0227, 0)

算子公式体现权重的方式信息利用竞赛建议
M(,)M(\wedge,\vee) 取小取大bj=maximin(ai,rij)b_j = \max_i \min(a_i, r_{ij})取小封顶最少(只留主要因素)仅做对比,不用它下结论
M(,)M(\cdot,\vee) 乘积取大bj=maxi(airij)b_j = \max_i (a_i r_{ij})乘法缩放较少(仍只取最大)少用
M(,+)M(\cdot,+) 加权平均bj=iairijb_j = \sum_i a_i r_{ij}乘法加权全部推荐,竞赛标配

竞赛提示:论文中写"选用加权平均型算子 M(,+)M(\cdot,+),它能充分利用全部单因素评价信息"这一句话,就足以让评审认可你的算子选择;若再对比一下 M(,)M(\wedge,\vee) 的结果并指出其信息丢失,属于加分操作(第六节代码就是这么做的)。

1.6 结果判定:最大隶属度原则与加权平均综合得分

得到 BB 后如何下结论?两种主流方法,通常并用

方法一:最大隶属度原则——BB 中最大分量对应的等级就是结论:

bj=max1jmbj评价等级为 vjb_{j^*} = \max_{1 \le j \le m} b_j \quad \Rightarrow \quad \text{评价等级为 } v_{j^*}

但最大隶属度原则不是永远可靠的:当 BB 的分布比较"平坦"(最大分量与次大分量相差不大)时,单凭 0.01 的差距下结论没有说服力。常用有效度指标 α\alpha 判断(β\beta 为最大分量、γ\gamma 为次大分量、nn 为等级数):

α=nβ12γ(n1)\alpha = \frac{n\beta - 1}{2\gamma(n-1)}

  • α0.5\alpha \ge 0.5:最大隶属度原则有效,可直接判定;
  • α<0.5\alpha < 0.5(或经验法则 β/γ<1.52\beta/\gamma < 1.5 \sim 2):原则失效,应改用加权平均综合得分判定。

本文示例:β=0.6591\beta = 0.6591γ=0.2357\gamma = 0.2357α=5×0.659112×0.2357×4=1.21740.5\alpha = \frac{5 \times 0.6591 - 1}{2 \times 0.2357 \times 4} = 1.2174 \ge 0.5,原则有效。

方法二:加权平均综合得分——给每个等级赋一个代表分值 sjs_j,再按隶属度加权:

S=j=1msjbjS = \sum_{j=1}^{m} s_j \, b_j

等级优秀良好中等及格不及格
赋分 sjs_j(常见)9585756555
综合得分带90\ge 90[80,90)[80, 90)[70,80)[70, 80)[60,70)[60, 70)<60< 60

本文示例:S=95×0.6591+85×0.2357+75×0.0825+65×0.0227=90.31S = 95 \times 0.6591 + 85 \times 0.2357 + 75 \times 0.0825 + 65 \times 0.0227 = 90.31 分 → 对应"优秀",与最大隶属度原则结论一致。综合得分还有一个大用处:多个评价对象需要排序时,向量 BB 之间无法直接比较大小,得分 SS 可以——所以竞赛中常给"每位教师/每家企业"都算一个 SS 然后排序。

1.7 多级模糊综合评价(因素分层)的思想

当因素很多时(如"教学质量"下分 4 个方面、每个方面下再分 3~4 个具体指标,共十几项),直接让 15 个因素一次性竞争权重会稀释权重、也难以两两比较。多级模糊综合评价把因素分成若干层,逐层评价:

目标层: 教学质量
|
准则层: 教学水平 教学素养
/ \ / \
指标层: 教学内容 教学方法 教学态度 教学效果

做法分两步(以二级模型为例):

  1. 底层一级评价:对每个准则下的因素子集 UkU_k,用该子集内因素的权重 AkA_k 与其隶属度矩阵 RkR_k 合成,得到该准则的评价向量 Bk=AkRkB_k = A_k \circ R_k
  2. 顶层二级评价:把所有准则的评价向量拼成新的"隶属度矩阵" R=(B1;B2;;BK)R' = (B_1; B_2; \dots; B_K),再用准则层权重 AA 合成:B=ARB = A \circ R'

三级、四级模型以此类推,自底向上逐层合成。多级模型的优点:每层因素数量少、权重好定、判断矩阵好构造,且能输出每一层的中间评价结果(如"教学水平"单独评了多少分),论文层次感更强。竞赛中因素超过 6~8 个时,强烈建议使用多级模型。

1.8 优缺点

优点

  • 擅长处理定性、模糊信息:专家评语、满意度打分这类"说不清边界"的信息正是它的主场,不需要硬凑精确数值;
  • 结果信息丰富:输出是一个完整的等级分布向量 BB(而非一个孤零零的分数),可以读出"优秀 66%、良好 24%"这样的细腻结构;
  • 模型简单、可解释性强:五要素清清楚楚,公式只有一次矩阵合成,评审老师容易看懂;
  • 可分层扩展:多级模型能评价几十个因素的大指标体系;
  • 兼容多种定权方法:AHP、熵权、专家打分、组合赋权都可无缝接入。

缺点

  • 隶属度确定主观:隶属函数形状、专家投票、等级划分都依赖人为设定,不同设定可能得出不同结论(应在论文中做灵敏度分析回应);
  • 权重主观:AHP 判断矩阵是专家主观给出,虽有一致性检验兜底,但仍是争议点;
  • 结果依赖合成算子M(,)M(\wedge,\vee)M(,+)M(\cdot,+) 结果差别可能很大,选错算子结论就跑偏;
  • 最大隶属度原则可能失效BB 分布平坦时"最大分量"没有说服力,需要 α\alpha 检验或改用加权平均;
  • 无法处理指标间相关/冲突:这是评价方法共性的短板,可结合 TOPSIS、灰色关联等互验。

二、何时使用(适用场景与条件)

2.1 适用场景

凡满足"评价结果天然是等级、评价信息带有模糊性"的问题,模糊综合评价都值得一试:

  1. 教学质量评价:对教师、课程、教材做"优秀/良好/中等/及格/不及格"的评定(本文示例);
  2. 顾客/用户满意度:满意度本身就是"很满意/满意/一般/不满意"的模糊等级,隶属度矩阵可直接来自问卷各档人数比例;
  3. 环境质量评价:空气、水质的"优/良/轻度污染/中度污染/重度污染"分级,且各指标(PM2.5、SO₂ 等)的等级边界本身是模糊的;
  4. 食品安全风险评估:风险等级(低/中/高)由多种定性、半定量因素共同决定;
  5. 工程评标与供应商选择:标书评审的"商务/技术/价格"评分与"优/良/中"评定;
  6. 绩效、信用与竞争力评价:员工绩效等级、企业信用评级、城市竞争力等——竞赛中出现频率最高的应用大类。

2.2 竞赛典型题目

评价类题目是国赛的常客,以下题目常被用作模糊综合评价的教学案例:

  • 2005 国赛 A 题"长江水质的评价和预测":对 17 个观测站的水质按《地表水环境质量标准》做综合评价,经典做法即"各指标隶属函数 → 隶属度矩阵 → AHP 定权 → 模糊综合评价";
  • 2015 国赛 B 题"互联网+"时代的出租车资源配置:评价不同时空的"供求匹配程度"(一个典型的模糊概念);
  • 2016 国赛 B 题"小区开放对道路通行的影响":对小区开放效果做综合评价;
  • 历年题目中"满意度调查、服务质量评估、方案比选、绩效评定"类问题,凡涉及定性指标与等级划分的,模糊综合评价几乎都是标配方法之一。

竞赛提示:近年国赛题目越来越开放,评价对象常由参赛者自己定义。模糊综合评价 + AHP 的组合"套路成熟、叙述清晰、结果好看",是评价类题目性价比最高的方案之一;但也正因用的人多,必须在建模过程(隶属度怎么来的、权重怎么定的、灵敏度如何)上写出细节才能拉开差距。

2.3 使用前提(建模前检查清单)

检查项具体要求检查手段
能构造隶属度矩阵每个因素能给出对各等级的隶属度(投票/隶属函数/频率)专家问卷可发放、或指标有数值可代公式
评语集合理等级数 3~5 个,语义互斥且覆盖全部可能与领域标准一致(如水质标准、绩效等级)
权重有依据AHP 判断矩阵通过一致性检验(CR < 0.1)计算 λmax\lambda_{\max}、CI、CR
隶属度矩阵行归一化每行之和为 1,无全零行按行求和检查
指标同向化各指标"越大越好"或统一转为正向逆向指标取倒数/取负后再构造隶属函数
单因素评价可信投票专家有代表性、样本量足够(一般 ≥ 10 位)说明专家构成与抽样方法

2.4 不适用 / 慎用的情形

  1. 全定量数据且需精确排序:指标都是实测数值(如利润、成本、产量)、评价结果用于精细排序时,TOPSIS(逼近理想解)或熵权法更直接——它们不需要人为划分等级,输出就是精确得分;模糊综合评价的等级划分反而会损失精度;
  2. 需要严格客观结论:隶属度与权重都主观,若评审明确要求"完全基于数据的客观评价",纯模糊综合评价会被质疑,应至少用熵权法替换 AHP 定权;
  3. 结果用于精确预测/规划:模糊综合评价是评价方法,不是预测方法;它告诉你"现状处于哪个等级",不告诉你"明年会是多少";
  4. 评价对象间差异极小时:若所有对象打分都集中在同一等级(如都"良好"),模糊综合评价的区分度很低,需要细化评语集或引入更细的量化指标。

几种主流评价方法的对比:

方法核心思想适合情形与模糊综合评价的关系
模糊综合评价隶属度矩阵 + 权重合成定性指标多、等级界限模糊本文主角
AHP两两比较定权重只需定权/多准则决策常给模糊综合评价供权重,黄金搭档
TOPSIS距正负理想解的距离排序全定量、要精确排序与 FCE 互验或组合成模糊 TOPSIS
熵权法数据离散程度定客观权重有完整数据、要客观定权替换/混合 AHP 为 FCE 定权
灰色关联分析与参考序列的几何相似度少数据、贫信息常与 FCE 并列做交叉验证

2.5 与 AHP、TOPSIS、熵权法的经典组合

  1. AHP 定权 + 模糊综合评价(黄金组合):AHP 负责"谁更重要"(输出权重 AA),模糊综合评价负责"实际表现如何"(输出向量 BB)。两者各司其职,是竞赛论文中出现频率最高的评价套路;
  2. 熵权法定权 + 模糊综合评价:当指标有实际观测数据时,用熵权法从数据本身提取权重(客观),替换或修正 AHP 的主观权重,回应"权重太主观"的质疑;
  3. 组合赋权 + 模糊综合评价wi=λwiAHP+(1λ)wi熵权w_i = \lambda w_i^{AHP} + (1-\lambda) w_i^{熵权}(线性加权)或 wi=wiAHPwi熵权/w_i = w_i^{AHP} w_i^{熵权} / \sum(乘法归一),主观与客观兼顾;
  4. 模糊综合评价 + TOPSIS 交叉验证:同一个问题分别用两种方法评价,若排序结果大体一致,说明结论稳健——这是评审眼中的加分操作;
  5. 模糊 TOPSIS:把隶属度矩阵当作决策矩阵、等级当作"属性",在模糊环境下找理想解,是两方法的直接融合。

三、算法指标

下面每个指标都给出:中文名、公式、取值范围、如何解读。符号定义见第五节,本文示例数值来自第六节可运行程序(教学质量评价示例)。

3.1 综合评价向量 B(各评语等级隶属度)

B=AR=(b1,b2,,bm),bj=i=1nairij    (加权平均型 M(,+))B = A \circ R = (b_1, b_2, \dots, b_m), \qquad b_j = \sum_{i=1}^{n} a_i \, r_{ij} \;\; (\text{加权平均型 } M(\cdot,+))

  • 取值范围bj[0,1]b_j \in [0,1];加权平均型下 jbj=1\sum_j b_j = 1(取小取大型下分量和通常 <1< 1,这是判断信息是否丢失的直观标志);
  • 含义:评价对象整体上属于各评语等级的隶属程度,是模糊综合评价的核心输出;
  • 解读:本文示例 B=(0.6591,0.2357,0.0825,0.0227,0)B = (0.6591, 0.2357, 0.0825, 0.0227, 0),读作"该教师教学质量以 65.91% 的程度属于优秀、23.57% 属于良好、……";最大分量对应等级即初步结论;分量分布的"尖峭/平坦"反映结论的确定程度。

3.2 综合得分 S(等级赋分加权平均)

S=j=1msjbj=B(s1,,sm)TS = \sum_{j=1}^{m} s_j \, b_j = B \cdot (s_1, \dots, s_m)^T

  • 取值范围:介于最高与最低等级赋分之间,如赋分 [95,85,75,65,55][95,85,75,65,55]S[55,95]S \in [55, 95],单位与赋分一致(分);
  • 方向:越大越好;
  • 解读:把等级分布"压缩"成一个可比较的分数。本文示例 S=95×0.6591+85×0.2357+75×0.0825+65×0.0227+55×0=90.31S = 95 \times 0.6591 + 85 \times 0.2357 + 75 \times 0.0825 + 65 \times 0.0227 + 55 \times 0 = 90.31 分,落在 [90,100][90,100] 分数带 → "优秀",与最大隶属度结论一致。主要用途:多个评价对象排序、与最大隶属度结论交叉印证。

3.3 最大隶属度原则及其有效性(β\betaγ\gammaα\alpha

bj=maxjbj=βvjα=nβ12γ(n1),γ=次大分量b_{j^*} = \max_j b_j = \beta \quad \Rightarrow \quad v_{j^*} \qquad \alpha = \frac{n\beta - 1}{2\gamma(n-1)}, \quad \gamma = \text{次大分量}

  • 判定规则β/γ2\beta/\gamma \ge 2(或 α0.5\alpha \ge 0.5)时最大隶属度原则有效;β/γ<1.5\beta/\gamma < 1.5(或 α<0.5\alpha < 0.5)时原则失效,两个等级"难分高下",应改用综合得分 SS 判定;
  • 解读:本文示例 β=0.6591\beta = 0.6591(优秀),γ=0.2357\gamma = 0.2357(良好),β/γ=2.7962\beta/\gamma = 2.796 \ge 2α=(5×0.65911)/(2×0.2357×4)=1.21740.5\alpha = (5 \times 0.6591 - 1)/(2 \times 0.2357 \times 4) = 1.2174 \ge 0.5,原则有效、结论可信。注意:当 BB 出现"双峰"(如 (0.42,0.40,0.18,0,0)(0.42, 0.40, 0.18, 0, 0))时 α<0.5\alpha < 0.5,硬按最大隶属度下结论会被评审质疑。

3.4 单因素评价向量 rir_i(第 i 个因素对各等级的隶属度)

ri=(ri1,ri2,,rim),j=1mrij=1r_i = (r_{i1}, r_{i2}, \dots, r_{im}), \qquad \sum_{j=1}^{m} r_{ij} = 1

  • 取值范围rij[0,1]r_{ij} \in [0,1],行和恒为 1;
  • 含义:抛开其他因素,仅从第 ii 个因素看,对象属于各等级的程度。它是 RR 的一行,也是构成 BB 的原料;
  • 解读:单因素向量用于短板诊断——哪个因素的最大隶属度落在低等级,哪个因素就是拖后腿的短板。本文示例中"教学内容"的向量为 (0.75,0.15,0.10,0,0)(0.75, 0.15, 0.10, 0, 0)(明显优秀),"教学方法"为 (0.50,0.35,0.10,0.05,0)(0.50, 0.35, 0.10, 0.05, 0)(相对较弱,还有 5% 专家投"及格"),可知该教师应在教学方法上改进。

3.5 权重一致性指标 CI 与 CR(AHP 定权的配套检验)

CI=λmaxnn1,CR=CIRICI = \frac{\lambda_{\max} - n}{n - 1}, \qquad CR = \frac{CI}{RI}

  • RI(平均随机一致性指标)查表值n=1,2n=1,2 时 RI =0= 0n=3n=30.580.58n=4n=40.890.89n=5n=51.121.12n=6n=61.241.24
  • 判定规则CR<0.1CR < 0.1 时判断矩阵一致性可接受,权重可信;否则应请专家重新打分;
  • 解读:本文示例 λmax=4.0104\lambda_{\max} = 4.0104CI=(4.01044)/3=0.0035CI = (4.0104-4)/3 = 0.0035CR=0.0035/0.89=0.0039<0.1CR = 0.0035/0.89 = 0.0039 < 0.1,一致性检验通过。注意:这个指标本身不是模糊综合评价的输出,但它是 AHP 定权可信度的证明,论文中必须报告。

3.6 指标汇总表

指标公式取值/阈值解读要点
综合评价向量 BBbj=iairijb_j = \sum_i a_i r_{ij}M(,+)M(\cdot,+)bj[0,1]b_j \in [0,1],和为 1最大分量对应等级即结论;分布平坦则结论不牢
综合得分 SSS=jsjbjS = \sum_j s_j b_j介于最高/最低赋分之间用于对象排序;与最大隶属度交叉印证
最大隶属度 β\betaβ=maxjbj\beta = \max_j b_j[1/n,1][1/n, 1]β\beta 越接近 1 结论越确定
原则有效性 α\alphaα=nβ12γ(n1)\alpha = \dfrac{n\beta - 1}{2\gamma(n-1)}α0.5\alpha \ge 0.5 有效α<0.5\alpha < 0.5 时改用加权平均判定
单因素评价向量 rir_iRR 的第 iirij[0,1]r_{ij} \in [0,1],行和为 1短板诊断:看哪个因素弱
一致性指标 CICICRCRCI=λmaxnn1CI = \dfrac{\lambda_{\max}-n}{n-1}CR=CI/RICR = CI/RICR<0.1CR < 0.1 通过AHP 权重可信度的证明

四、可视化图表

4.1 四张图速查表

图名(文件名)用途关键解读点
图① 隶属函数曲线图(fce_membership_curves.png展示各等级隶属函数形状(横轴指标值、纵轴隶属度)与相邻等级重叠关系曲线峰值位置 = 该等级的"典型值";相邻曲线交点 = 等级分界;好的隶属函数应覆盖全区间、无空档;垂线处的纵坐标即某指标值的各等级隶属度(如 x=92x=92 时优秀 0.7、良好 0.3)
图② 隶属度矩阵热力图(fce_matrix_heatmap.png展示 RR 的整体结构(行 = 因素、列 = 等级)颜色越深隶属度越大;每行之和必须为 1;深色块若集中在对角带说明因素间区分度高;某行全浅说明该因素"没有立场"
图③ 各因素评价等级条形图(fce_factor_bars.png分组柱状图展示每个因素在各等级的分布柱高 = 投票比例;哪个因素的"优秀柱"矮、"及格柱"高,哪个就是短板;柱形扁平(各等级差不多)说明该因素争议大
图④ 综合评价结果等级分布图(fce_result_dist.pngB 向量条形图 + 饼图,标注最大隶属度等级最高柱(最大扇区)即结论等级,应用醒目颜色高亮并标注数值;分布呈"单峰尖峭" → 结论明确;"双峰/平台" → 最大隶属度原则存疑,改看综合得分

4.2 每张图"好"与"异常"的特征

  • 图① 隶属函数曲线:好图——各曲线平滑连续、相邻曲线重叠约一半区间、整个横轴区间无"三不管"空档、任意 xx 处各曲线值之和为 1;异常——两曲线之间出现空档(某段 xx 对所有等级隶属度都为 0,评价会"卡死")、曲线总高超过 1(不是模糊划分,BB 分量和会大于 1)、拐点位置与评分标准语义不符。
  • 图② 热力图:好图——每行和为 1、数值与深浅一致、颜色最深的格子分布在对角线附近(各因素"各说各话"但指向一致);异常——某一行全为 0(该因素没参与评价,检查数据)、行和 ≠ 1(忘记归一化)、一行均匀分布(该因素区分度为零,考虑删除或重新设计)。
  • 图③ 分组柱状图:好图——每组 5 根柱高低错落、每组的"主峰"位置能一眼看出;异常——某因素各柱几乎一样高(无区分度)、柱顶未标注数值(读者无法读取精确比例)、各因素色标与图①②不一致(同一等级换了颜色)。
  • 图④ 结果分布图:好图——最大柱高亮且标注数值与等级名、饼图剔除了零扇区、图题含综合得分;异常——双峰或平台分布(必须同时报告 α\alpha 与综合得分,不可只按最大隶属度下结论)、饼图带 0 值扇区(出现零厚度细线,不专业)。

五、符号说明

符号含义示例/单位
UU因素集(指标集)U={U = \{教学内容, 教学方法, 教学态度, 教学效果}\}
VV评语集(等级集)V={V = \{优秀, 良好, 中等, 及格, 不及格}\}
nnmm因素个数、等级个数本文示例 n=4n=4m=5m=5
uiu_iii 个评价因素u1u_1 = 教学内容
vjv_jjj 个评语等级v1v_1 = 优秀
AA因素权重向量A=(0.4231,0.2274,0.1222,0.2274)A = (0.4231, 0.2274, 0.1222, 0.2274)
aia_iii 个因素的权重a1=0.4231a_1 = 0.4231ai=1\sum a_i = 1,无单位
RR单因素评价(隶属度)矩阵,n×mn \times m由专家投票比例或隶属函数得到
rijr_{ij}ii 个因素对第 jj 等级的隶属度r11=0.75r_{11} = 0.75rij[0,1]r_{ij} \in [0,1]
rir_iii 个因素的单因素评价向量(RR 的第 ii 行)r1=(0.75,0.15,0.10,0,0)r_1 = (0.75, 0.15, 0.10, 0, 0)
BB综合评价向量 B=ARB = A \circ RB=(0.6591,0.2357,0.0825,0.0227,0)B = (0.6591, 0.2357, 0.0825, 0.0227, 0)
bjb_j评价对象整体对第 jj 等级的隶属度b1=0.6591b_1 = 0.6591
\circ模糊合成算子M(,+)M(\cdot,+)M(,)M(\wedge,\vee)M(,)M(\cdot,\vee)
\wedge\vee取小 min\min、取大 max\max0.40.7=0.40.4 \wedge 0.7 = 0.40.40.7=0.70.4 \vee 0.7 = 0.7
μA(x)\mu_A(x)隶属函数:xx 对模糊集 AA 的隶属度μ优秀(92)=0.7\mu_{\text{优秀}}(92) = 0.7
sjs_jjj 等级的赋值分s=(95,85,75,65,55)s = (95, 85, 75, 65, 55),分
SS综合得分 S=jsjbjS = \sum_j s_j b_jS=90.31S = 90.31
β\betaγ\gamma最大分量、次大分量β=0.6591\beta = 0.6591γ=0.2357\gamma = 0.2357
α\alpha最大隶属度原则有效度α=1.21740.5\alpha = 1.2174 \ge 0.5(有效)
PPAHP 判断矩阵(两两比较)p12=2p_{12} = 2:教学内容比教学方法稍微重要
λmax\lambda_{\max}CICICRCRAHP 最大特征值与一致性指标、比率λmax=4.0104\lambda_{\max} = 4.0104CR=0.0039<0.1CR = 0.0039 < 0.1
RIRI平均随机一致性指标(查表)n=4n=4RI=0.89RI = 0.89

六、可运行程序(完整代码)

环境要求:Python 3.12,依赖 numpy、matplotlib(本文代码仅用到这两个库;允许使用的库还包括 scipy、scikit-learn、pandas)。以下所有代码块按顺序拼接保存为 fce_demo.py 运行即可:控制台打印第三节全部指标(B 向量、两种合成算子对比、最大隶属度与有效性 α\alpha、综合得分、等级判定),并在 figures/ 子目录生成 4 张图(fce_membership_curves.pngfce_matrix_heatmap.pngfce_factor_bars.pngfce_result_dist.png)。

# -*- coding: utf-8 -*-
"""
============================================================
模糊综合评价(FCE)完整示例:高校教师教学质量评价
------------------------------------------------------------
内容:
(1) 因素集 U(4 因素)× 评语集 V(5 等级),隶属度矩阵 R 由 20 位专家投票比例构造
(2) AHP(方根法 + 一致性检验)确定因素权重 A
(3) 手写两种模糊合成算子:M(·,+) 加权平均型 与 M(∧,∨) 取小取大型,并对比
(4) 手写最大隶属度原则(含有效性检验 α)与加权平均综合得分(等级赋分 95/85/75/65/55)
(5) 定量指标示例:及格率 92% 经半梯形隶属函数映射为各等级隶属度
(6) 绘制并保存 4 张图到 figures/ 目录
依赖:numpy、matplotlib(Python 3.12)
============================================================
"""

# ========== 0. 导入库与全局设置 ==========
import os
import numpy as np
import matplotlib.pyplot as plt

# ---- matplotlib 中文显示设置(防止图内中文乱码)----
plt.rcParams["font.sans-serif"] = ["PingFang SC", "Arial Unicode MS", "SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# ---- 图片输出目录(相对当前工作目录的 figures/ 子目录)----
FIG_DIR = "figures"
os.makedirs(FIG_DIR, exist_ok=True)
# ========== 1. 构造数据:因素集、评语集、专家投票隶属度矩阵 R ==========
# 1.1 因素集 U(评价的 n=4 个方面)与评语集 V(m=5 个等级)
U = ["教学内容", "教学方法", "教学态度", "教学效果"]
V = ["优秀", "良好", "中等", "及格", "不及格"]
n_factor, n_grade = len(U), len(V)

# 1.2 隶属度矩阵 R:邀请 20 位专家(学生/督导/同行)对每个因素投票,
# 票数比例即隶属度 r_ij = 投票数 / 20(比例化后每行和为 1)
votes = np.array([
[15, 3, 2, 0, 0], # 教学内容:15 票优秀、3 票良好、2 票中等
[10, 7, 2, 1, 0], # 教学方法:10 票优秀、7 票良好、2 票中等、1 票及格
[15, 4, 1, 0, 0], # 教学态度
[12, 6, 1, 1, 0], # 教学效果
], dtype=float)
R = votes / votes.sum(axis=1, keepdims=True) # 每行除以该行票数之和 → 行归一化

# ---- 等级固定配色(优→不及格,全篇 4 张图统一,避免同一等级在不同图中变色)----
GRADE_COLORS = ["#1b7837", "#4575b4", "#e8c020", "#f78a35", "#d73027"]

print("=" * 66)
print("1. 专家投票票数矩阵(每行 20 票):")
print(votes.astype(int))
print("\n隶属度矩阵 R(每行归一化,行和 = 1):")
print(np.round(R, 4))
# ========== 2. AHP 确定因素权重(方根法 + 一致性检验) ==========
# 2.1 判断矩阵 P:专家按 1-9 标度两两比较 4 个因素的相对重要程度。
# 例如 p12 = 2 表示"教学内容比教学方法稍微重要";p34 = 0.5 表示"教学态度不如教学效果重要"
P = np.array([
[1.0, 2.0, 3.0, 2.0],
[0.5, 1.0, 2.0, 1.0],
[1/3, 0.5, 1.0, 0.5],
[0.5, 1.0, 2.0, 1.0],
])

# 2.2 方根法(几何平均法)求权重向量 A:
# 每行元素连乘后开 n 次方 → 得到"几何平均重要度" → 归一化(权重和 = 1)
geo_mean = np.prod(P, axis=1) ** (1.0 / len(P)) # 每行连乘开 n 次方
A = geo_mean / geo_mean.sum() # 归一化得到权重向量

# 2.3 一致性检验:λmax → CI → CR(RI 为 n=4 时的平均随机一致性指标 0.89)
lam = np.linalg.eigvals(P) # 判断矩阵全部特征值(正互反矩阵的谱半径 = λmax)
lam_max = float(lam.real.max()) # 最大特征值 λmax
CI = (lam_max - len(P)) / (len(P) - 1) # 一致性指标 CI = (λmax − n) / (n−1)
RI = 0.89 # 平均随机一致性指标(n=4 查表值)
CR = CI / RI # 一致性比率 CR

print("\n" + "=" * 66)
print("2. AHP 权重(方根法):A =", np.round(A, 4), "(权重和 =", round(A.sum(), 6), ")")
print(f"一致性检验:λmax = {lam_max:.4f},CI = {CI:.4f},CR = {CR:.4f}(CR < 0.1,通过)")
# ========== 3. 手写模糊合成算子:M(·,+) 与 M(∧,∨) 对比 ==========
def compose_weighted(A, R):
"""加权平均型算子 M(·,+):b_j = Σ_i a_i · r_ij。
用矩阵乘法即可实现;权重与隶属度全部参与运算,信息利用最充分(竞赛最常用)。"""
return A @ R

def compose_minmax(A, R):
"""主因素决定型算子 M(∧,∨):b_j = max_i min(a_i, r_ij)。
先对每个因素"取小"(权重给隶属度封顶),再在各因素间"取大"(只保留最突出的因素)。"""
B = np.zeros(R.shape[1])
for j in range(R.shape[1]):
B[j] = np.max(np.minimum(A, R[:, j])) # 逐列:先 min(a_i, r_ij),再取 max
return B

B_weighted = compose_weighted(A, R) # M(·,+) 加权平均型(正式评价采用)
B_minmax = compose_minmax(A, R) # M(∧,∨) 取小取大型(仅用于对比,展示信息丢失)

print("\n" + "=" * 66)
print("3. 两种合成算子的综合评价向量对比:")
print("M(·,+) 加权平均型 B =", np.round(B_weighted, 4),
"(分量和 =", round(B_weighted.sum(), 4), ")")
print("M(∧,∨) 取小取大型 B =", np.round(B_minmax, 4),
"(分量和 =", round(B_minmax.sum(), 4), ")")
print("→ M(∧,∨) 的分量和仅为 %.3f,不等于 1:它只保留了每个等级上最被看重的因素,"
"大量投票信息被丢弃,结论偏保守。竞赛推荐使用 M(·,+)。" % B_minmax.sum())
# ========== 4. 结果判定:最大隶属度原则 + 有效性检验 + 加权平均综合得分 ==========
SCORE = np.array([95.0, 85.0, 75.0, 65.0, 55.0]) # 各等级代表分值(优秀 95、良好 85、…)

def max_membership(B):
"""最大隶属度原则:取 B 中最大分量对应的等级作为评价结论。返回(等级序号, 最大分量 β)。"""
k = int(np.argmax(B))
return k, float(B[k])

def validity_alpha(B):
"""最大隶属度原则有效性指标:α = (n·β − 1) / (2·γ·(n−1)),
其中 β 为最大分量、γ 为次大分量、n 为等级数。α ≥ 0.5 时原则有效。"""
n = len(B)
gamma = float(np.sort(B)[-2]) # 次大分量 γ
if gamma <= 0:
return np.inf # γ = 0:其余等级全为 0,原则绝对有效
return (n * float(np.max(B)) - 1.0) / (2.0 * gamma * (n - 1.0))

def score_to_grade(s):
"""综合得分 → 等级(分数带:≥90 优秀,[80,90) 良好,[70,80) 中等,[60,70) 及格,<60 不及格)"""
for th, g in zip([90, 80, 70, 60, 0], V):
if s >= th:
return g
return V[-1]

B = B_weighted # 正式评价采用加权平均型算子的结果
k_max, beta = max_membership(B)
gamma = float(np.sort(B)[-2]) # 次大分量
alpha = validity_alpha(B)
score = float(B @ SCORE) # 综合得分 S = Σ_j b_j · s_j(隶属度加权平均)

print("\n" + "=" * 66)
print("4. 结果判定(采用 M(·,+) 算子的 B):")
print("综合评价向量 B =", np.round(B, 4))
print(f"最大隶属度原则:β = {beta:.4f}(等级“{V[k_max]}”),次大分量 γ = {gamma:.4f},"
f"比值 β/γ = {beta / gamma:.3f}")
print(f"最大隶属度原则有效性指标 α = {alpha:.4f}(α ≥ 0.5,原则有效,结论可信)")
print(f"加权平均综合得分 S = {score:.2f} 分 → 对应等级:“{score_to_grade(score)}”")
print(f"最终结论:该教师教学质量评定为“{V[k_max]}”(综合得分 {score:.2f} 分,"
f"两种判定方式结论一致)")
# ========== 5. 定量指标 → 隶属度:半梯形/梯形隶属函数(以及格率 92% 为例) ==========
def f_excellent(x):
"""优秀(升半梯形):μ = 0 (x<85);μ = (x−85)/10 (85≤x<95);μ = 1 (x≥95)"""
return np.where(x >= 95, 1.0, np.where(x >= 85, (x - 85.0) / 10.0, 0.0))

def f_good(x):
"""良好(中间梯形,峰值 1):μ = (x−75)/10 (75≤x<85);μ = (95−x)/10 (85≤x<95);其余 0"""
return np.where((x >= 85) & (x < 95), (95.0 - x) / 10.0,
np.where((x >= 75) & (x < 85), (x - 75.0) / 10.0, 0.0))

def f_medium(x):
"""中等(中间梯形):μ = (x−65)/10 (65≤x<75);μ = (85−x)/10 (75≤x<85);其余 0"""
return np.where((x >= 75) & (x < 85), (85.0 - x) / 10.0,
np.where((x >= 65) & (x < 75), (x - 65.0) / 10.0, 0.0))

def f_pass(x):
"""及格(中间梯形):μ = (x−55)/10 (55≤x<65);μ = (75−x)/10 (65≤x<75);其余 0"""
return np.where((x >= 65) & (x < 75), (75.0 - x) / 10.0,
np.where((x >= 55) & (x < 65), (x - 55.0) / 10.0, 0.0))

def f_fail(x):
"""不及格(降半梯形):μ = 1 (x<55);μ = (65−x)/10 (55≤x<65);μ = 0 (x≥65)"""
return np.where(x <= 55, 1.0, np.where(x < 65, (65.0 - x) / 10.0, 0.0))

MEMBER_FUNCS = [f_excellent, f_good, f_medium, f_pass, f_fail] # 与评语集 V 一一对应

def fuzzify(x):
"""任意指标值 x → 各等级隶属度行向量(长度 = 等级数;本构造下各分量和为 1)"""
return np.array([f(x) for f in MEMBER_FUNCS])

x0 = 92.0 # 某教师所授班级的及格率 92%
r_quant = fuzzify(x0) # 隶属函数法构造单因素评价向量
B_quant = compose_weighted(np.array([1.0]), r_quant.reshape(1, -1)).ravel() # 单因素权重 [1]
score_quant = float(B_quant @ SCORE) # 单因素综合评价得分

print("\n" + "=" * 66)
print(f"5. 定量指标示例:及格率 x = {x0:.0f}% 经半梯形隶属函数映射:")
print("各等级隶属度 r =", np.round(r_quant, 4))
print("(92% 介于 85~95 之间:以 0.7 属于“优秀”、0.3 属于“良好”,其余为 0——"
"同一个值同时隶属两个相邻等级,正是“模糊”的含义)")
print("单因素评价向量 B =", np.round(B_quant, 4))
print(f"综合得分 S = {score_quant:.2f} 分(0.7×95 + 0.3×85 = 92,恰好还原原指标值)")
# ========== 6. 图① 隶属函数曲线图(半梯形/梯形,横轴指标值、纵轴隶属度) ==========
xgrid = np.linspace(0, 100, 401) # 指标取值网格 [0, 100]
fig, ax = plt.subplots(figsize=(9, 5))
for f, c, name in zip(MEMBER_FUNCS, GRADE_COLORS, V):
ax.plot(xgrid, f(xgrid), lw=2, color=c, label=f"{name} μ(x)") # 5 条隶属曲线
ax.axvline(x0, color="gray", ls="--", lw=1.2) # 标出及格率 92% 的位置
ax.annotate(f"x = {x0:.0f}%\nμ优秀 = {f_excellent(x0):.1f}\nμ良好 = {f_good(x0):.1f}",
xy=(x0, 0.72), xytext=(48, 0.50), fontsize=10,
arrowprops=dict(arrowstyle="->", color="gray", lw=1.2))
ax.set_xlabel("指标值 x(如及格率 %)")
ax.set_ylabel("隶属度 μ(x)")
ax.set_title("图① 半梯形/梯形隶属函数曲线(相邻等级曲线重叠:同一 x 可同时隶属多个等级)")
ax.set_xlim(0, 100)
ax.set_ylim(0, 1.05)
ax.grid(alpha=0.3)
ax.legend(fontsize=9, loc="upper right")
fig.tight_layout()
fig.savefig(os.path.join(FIG_DIR, "fce_membership_curves.png"), dpi=150)
plt.show()
# ========== 7. 图② 隶属度矩阵 R 热力图(因素 × 等级) ==========
fig, ax = plt.subplots(figsize=(9, 4.5))
im = ax.imshow(R, cmap="Blues", vmin=0, vmax=1, aspect="auto") # 颜色深浅 = 隶属度大小
ax.set_xticks(range(n_grade))
ax.set_xticklabels(V)
ax.set_yticks(range(n_factor))
ax.set_yticklabels(U)
for i in range(n_factor): # 每格标注数值
for j in range(n_grade):
ax.text(j, i, f"{R[i, j]:.2f}", ha="center", va="center", fontsize=10,
color="white" if R[i, j] > 0.55 else "black")
ax.set_title("图② 隶属度矩阵 R 热力图(行 = 因素,列 = 等级;每行和为 1)")
fig.colorbar(im, ax=ax, label="隶属度", shrink=0.9)
fig.tight_layout()
fig.savefig(os.path.join(FIG_DIR, "fce_matrix_heatmap.png"), dpi=150)
plt.show()
# ========== 8. 图③ 各因素评价等级条形图(分组柱状图:因素 × 等级) ==========
fig, ax = plt.subplots(figsize=(10, 5))
xpos = np.arange(n_factor)
width = 0.16 # 柱宽:每个因素并排画 5 根柱
for j in range(n_grade):
ax.bar(xpos + (j - 2) * width, R[:, j], width, label=V[j],
color=GRADE_COLORS[j], edgecolor="black", lw=0.5)
ax.set_xticks(xpos)
ax.set_xticklabels(U, fontsize=11)
ax.set_ylabel("隶属度(专家投票比例)")
ax.set_ylim(0, 0.85)
ax.set_title("图③ 各因素对各等级的隶属度(分组柱状图)")
ax.legend(ncol=5, fontsize=9, loc="upper center", bbox_to_anchor=(0.5, -0.12))
ax.grid(axis="y", alpha=0.3)
fig.subplots_adjust(bottom=0.18) # 给图例留出下方空间
fig.savefig(os.path.join(FIG_DIR, "fce_factor_bars.png"), dpi=150)
plt.show()
# ========== 9. 图④ 综合评价结果等级分布图(B 向量:条形图 + 饼图) ==========
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4.8))

# 左:B 向量条形图,最大隶属度对应等级用其等级色高亮,其余灰色
bar_colors = [GRADE_COLORS[j] if j == k_max else "#d9d9d9" for j in range(n_grade)]
ax1.bar(range(n_grade), B, color=bar_colors, edgecolor="black", lw=0.5)
for j, bj in enumerate(B): # 柱顶标注数值
ax1.text(j, bj + 0.012, f"{bj:.3f}", ha="center", fontsize=10)
ax1.set_xticks(range(n_grade))
ax1.set_xticklabels(V)
ax1.set_ylim(0, 0.75)
ax1.set_ylabel("隶属度")
ax1.set_title(f"综合评价向量 B(最大隶属度:{V[k_max]},β = {beta:.3f})")
ax1.grid(axis="y", alpha=0.3)

# 右:B 向量饼图,剔除隶属度为 0 的等级(避免出现零厚度扇区)
mask = B > 1e-12
idx = np.nonzero(mask)[0]
ax2.pie(B[mask], labels=[V[j] for j in idx], autopct="%.1f%%",
colors=[GRADE_COLORS[j] for j in idx], startangle=90, counterclock=False,
explode=[0.05 if j == k_max else 0 for j in idx])
ax2.set_title(f"B 向量等级分布饼图(综合得分 {score:.2f} 分)")
fig.suptitle("图④ 综合评价结果等级分布", fontsize=13)
fig.tight_layout(rect=[0, 0, 1, 0.94])
fig.savefig(os.path.join(FIG_DIR, "fce_result_dist.png"), dpi=150)
plt.show()
# ========== 10. 全部指标汇总打印(对应文档第三节的指标清单) ==========
print("\n" + "=" * 66)
print("模糊综合评价结果汇总(教学质量评价示例)")
print("=" * 66)
print("因素权重 A(AHP 方根法):", np.round(A, 4))
print("综合评价向量 B(M(·,+)) :", np.round(B, 4))
print("综合评价向量 B(M(∧,∨)) :", np.round(B_minmax, 4))
print(f"最大隶属度等级 : {V[k_max]}(β = {beta:.4f},γ = {gamma:.4f},"
f"β/γ = {beta / gamma:.3f},α = {alpha:.4f})")
print(f"综合得分 : {score:.2f} 分(对应等级:{score_to_grade(score)})")
print("4 张图已保存到 figures/ 目录:")
print(" fce_membership_curves.png / fce_matrix_heatmap.png / "
"fce_factor_bars.png / fce_result_dist.png")

七、结果解读与注意事项

7.1 运行输出解读(以教学质量评价示例为例)

运行第六节代码(MPLBACKEND=Agg python fce_demo.py,避免交互窗口阻塞),控制台输出如下:

==================================================================
1. 专家投票票数矩阵(每行 20 票):
[[15 3 2 0 0]
[10 7 2 1 0]
[15 4 1 0 0]
[12 6 1 1 0]]

隶属度矩阵 R(每行归一化,行和 = 1):
[[0.75 0.15 0.1 0. 0. ]
[0.5 0.35 0.1 0.05 0. ]
[0.75 0.2 0.05 0. 0. ]
[0.6 0.3 0.05 0.05 0. ]]

==================================================================
2. AHP 权重(方根法):A = [0.4231 0.2274 0.1222 0.2274] (权重和 = 1.0 )
一致性检验:λmax = 4.0104,CI = 0.0035,CR = 0.0039(CR < 0.1,通过)

==================================================================
3. 两种合成算子的综合评价向量对比:
M(·,+) 加权平均型 B = [0.6591 0.2357 0.0825 0.0227 0. ] (分量和 = 1.0 )
M(∧,∨) 取小取大型 B = [0.4231 0.2274 0.1 0.05 0. ] (分量和 = 0.8005 )
→ M(∧,∨) 的分量和仅为 0.800,不等于 1:它只保留了每个等级上最被看重的因素,大量投票信息被丢弃,结论偏保守。竞赛推荐使用 M(·,+)。

==================================================================
4. 结果判定(采用 M(·,+) 算子的 B):
综合评价向量 B = [0.6591 0.2357 0.0825 0.0227 0. ]
最大隶属度原则:β = 0.6591(等级“优秀”),次大分量 γ = 0.2357,比值 β/γ = 2.796
最大隶属度原则有效性指标 α = 1.2174(α ≥ 0.5,原则有效,结论可信)
加权平均综合得分 S = 90.31 分 → 对应等级:“优秀”
最终结论:该教师教学质量评定为“优秀”(综合得分 90.31 分,两种判定方式结论一致)

==================================================================
5. 定量指标示例:及格率 x = 92% 经半梯形隶属函数映射:
各等级隶属度 r = [0.7 0.3 0. 0. 0. ]
(92% 介于 85~95 之间:以 0.7 属于“优秀”、0.3 属于“良好”,其余为 0——同一个值同时隶属两个相邻等级,正是“模糊”的含义)
单因素评价向量 B = [0.7 0.3 0. 0. 0. ]
综合得分 S = 92.00 分(0.7×95 + 0.3×85 = 92,恰好还原原指标值)

==================================================================
模糊综合评价结果汇总(教学质量评价示例)
==================================================================
因素权重 A(AHP 方根法): [0.4231 0.2274 0.1222 0.2274]
综合评价向量 B(M(·,+)) : [0.6591 0.2357 0.0825 0.0227 0. ]
综合评价向量 B(M(∧,∨)) : [0.4231 0.2274 0.1 0.05 0. ]
最大隶属度等级 : 优秀(β = 0.6591,γ = 0.2357,β/γ = 2.796,α = 1.2174)
综合得分 : 90.31 分(对应等级:优秀)
4 张图已保存到 figures/ 目录:
fce_membership_curves.png / fce_matrix_heatmap.png / fce_factor_bars.png / fce_result_dist.png

逐项解读:

  • 隶属度矩阵 R:每行之和都是 1(行归一化检查通过)。"教学内容"与"教学态度"两行第一列高达 0.75(15/20 位专家投优秀),说明这两项公认出色;"教学方法"一行相对分散(0.50/0.35/0.10/0.05),还出现了 5% 的"及格"票,是该教师相对的短板——单因素向量(指标 3.4)的短板诊断结论。
  • AHP 权重A=(0.4231,0.2274,0.1222,0.2274)A = (0.4231, 0.2274, 0.1222, 0.2274),教学内容最被看重(42.3%),教学方法与教学效果并列第二,教学态度最轻。CR=0.0039<0.1CR = 0.0039 < 0.1,判断矩阵一致性良好,权重可信。
  • 两种算子的对比M(,+)M(\cdot,+) 给出 B=(0.6591,0.2357,0.0825,0.0227,0)B = (0.6591, 0.2357, 0.0825, 0.0227, 0),分量和为 1;M(,)M(\wedge,\vee) 给出 (0.4231,0.2274,0.1000,0.0500,0)(0.4231, 0.2274, 0.1000, 0.0500, 0),分量和仅 0.8005——"优秀"分量被最大权重 0.4231 直接封顶,中等、及格的投票信息几乎被抹平。结论相同但信息量天差地别,这正是竞赛要求使用加权平均型的理由。
  • 最大隶属度原则β=0.6591\beta = 0.6591 对应"优秀";β/γ=0.6591/0.2357=2.7962\beta/\gamma = 0.6591/0.2357 = 2.796 \ge 2,有效度 α=1.21740.5\alpha = 1.2174 \ge 0.5,原则有效,结论可信。
  • 综合得分S=95×0.6591+85×0.2357+75×0.0825+65×0.0227=90.31S = 95 \times 0.6591 + 85 \times 0.2357 + 75 \times 0.0825 + 65 \times 0.0227 = 90.31 分,落在 [90,100][90, 100] 分数带 → "优秀",与最大隶属度结论一致(两种判定方式互相印证,结论稳健)。
  • 定量指标示例:及格率 92% 经半梯形隶属函数映射为 (0.7,0.3,0,0,0)(0.7, 0.3, 0, 0, 0)——"92% 以 0.7 的程度属于优秀、以 0.3 的程度属于良好"。单因素合成后综合得分 S=0.7×95+0.3×85=92.00S = 0.7 \times 95 + 0.3 \times 85 = 92.00 分,恰好还原原指标值 92(隶属函数构成模糊划分时的一般性质),说明整个"隶属化 → 评价 → 赋分"回路没有信息失真。

7.2 四张图的解读(本例)

  • 图①:5 条隶属曲线相邻重叠、覆盖 [0,100][0,100] 全区间无空档;虚线标出 x=92x = 92 的位置,读图可得 μ优秀(92)=0.7\mu_{\text{优秀}}(92) = 0.7μ良好(92)=0.3\mu_{\text{良好}}(92) = 0.3,与第 5 段输出一致。
  • 图②:颜色最深的格子都在第一列(优秀)附近,"教学内容/教学态度"两行最深(0.75);行和均为 1;整体呈"向优秀倾斜"的形态,预示最终结论为优秀。
  • 图③:每组 5 根柱高低分明,"教学方法"组(第二组)的蓝色"良好"柱与浅色柱相对突出,直观暴露短板因素。
  • 图④:条形图最高柱(优秀,0.659)以绿色高亮,其余灰色;饼图剔除零扇区后显示"优秀 65.9% / 良好 23.6% / 中等 8.3% / 及格 2.3%"。分布单峰且尖峭,结论明确。

若任一图出现 4.2 节描述的异常特征(行和不为 1、空档、双峰等),回到第二节检查清单排查数据与隶属函数。

7.3 常见坑与应对

  1. 合成算子选错(最常犯):用了 M(,)M(\wedge,\vee) 取小取大却不自知——分量和小于 1、次要因素信息全部丢失,结论偏保守甚至与事实相反。应对:论文中明确写"选用加权平均型算子 M(,+)M(\cdot,+)",并可用两种算子对比展示信息丢失(本文代码即如此)。
  2. 隶属度矩阵行未归一化:专家票数直接当隶属度(行和为 20 而不是 1),或定量指标直接代原值(如把 92 当隶属度)。应对:每行除以行和;隶属函数法务必让 jμj(xi)=1\sum_j \mu_j(x_i) = 1。竞赛数据预处理段写一句"对隶属度矩阵按行归一化"即可。
  3. 等级赋分随意:赋分 sjs_j 拍脑袋(如 [100,90,80,70,60][100, 90, 80, 70, 60]),导致综合得分与最大隶属度结论经常打架。应对:赋分取各等级区间代表值(如 [95,85,75,65,55][95, 85, 75, 65, 55]),并在论文中说明赋分依据;赋分改变会影响 SS 但不影响 BB 与最大隶属度结论,可在灵敏度分析中展示。
  4. 最大隶属度原则失效时仍强行判定BB 呈双峰(如 (0.42,0.40,)(0.42, 0.40, \dots))时,0.02 的差距下结论没有说服力。应对:先算有效度 α\alpha(或 β/γ\beta/\gamma);α<0.5\alpha < 0.5 时改用加权平均综合得分判定,并在论文中说明原因。
  5. 隶属函数出现空档或重叠过度:某段指标区间没有任何等级的隶属度大于 0(评价"卡死"),或两等级曲线几乎重合(区分度为零)。应对:绘制图①目视检查;调整拐点使曲线覆盖全区间且相邻重叠约一半。
  6. AHP 不做一致性检验:判断矩阵自相矛盾(专家说 A 比 B 重要、B 比 C 重要、C 又比 A 重要)还照用权重。应对:必报 λmax\lambda_{\max}CICICRCRCR<0.1CR < 0.1 才用;不通过就请专家重新打分。
  7. 评语集不统一/等级过多:不同因素用了不同的评语集导致 RR 无法拼合;等级设到 7 级以上专家分不清相邻等级。应对:全指标体系统一评语集,等级数 3~5 个。
  8. 权重只来自一个人拍脑袋:单个专家给出的权重说服力弱。应对:多位专家分别构造判断矩阵,取几何平均(或特征向量平均)得到群决策权重;或并用熵权法做客观对照。
  9. 与客观方法不互验:模糊综合评价主观成分多,仅凭一个方法下结论容易被质疑。应对:与 TOPSIS、熵权法、灰色关联等交叉验证,排序大体一致即写"结论稳健"。
  10. 指标未同向化:逆向指标(如污染浓度越低越好)直接套"越大越好"的隶属函数。应对:逆向指标取倒数或"满分减原值"转正向后,再构造隶属函数。

7.4 竞赛论文写作建议(话术模板)

建模段(先讲为什么用、再讲五要素、再报结果;括号内为可替换内容):

由于(教学质量/满意度/水质等级)的评价涉及多个定性指标,且各等级之间不存在明确的数值界限,具有典型的模糊性,故采用模糊综合评价方法。建立因素集 U={u1,,un}U = \{u_1, \dots, u_n\} 与评语集 V={v1,,vm}V = \{v_1, \dots, v_m\};通过(专家投票/隶属函数/频率统计)构造单因素评价矩阵 RR;采用层次分析法确定因素权重,利用模糊综合评价对(教师教学质量)进行评价。选用加权平均型算子,综合评价向量 B=(0.45,0.32,0.18,0.05,0)B = (0.45, 0.32, 0.18, 0.05, 0),按最大隶属度原则判定为"优秀",综合得分 87.6 分。

本例填充版(数字与第六节输出一致):

采用层次分析法确定因素权重,利用模糊综合评价对高校教师教学质量进行评价。判断矩阵一致性比率 CR=0.0039<0.1CR = 0.0039 < 0.1,权重向量 A=(0.4231,0.2274,0.1222,0.2274)A = (0.4231, 0.2274, 0.1222, 0.2274)。选用加权平均型算子 M(,+)M(\cdot,+),综合评价向量 B=(0.6591,0.2357,0.0825,0.0227,0)B = (0.6591, 0.2357, 0.0825, 0.0227, 0)。最大隶属度 β=0.6591\beta = 0.6591 对应"优秀",有效度 α=1.21740.5\alpha = 1.2174 \ge 0.5,原则有效;按最大隶属度原则判定为"优秀",综合得分 90.31 分,两种判定方式结论一致。

算子选择与对比段(加分点):

本文选用加权平均型算子 M(,+)M(\cdot,+),其能充分利用全部单因素评价信息且综合评价向量分量和为 1;若改用主因素决定型算子 M(,)M(\wedge,\vee)BB 变为 (0.4231,0.2274,0.1000,0.0500,0)(0.4231, 0.2274, 0.1000, 0.0500, 0),分量和仅 0.8005,大量投票信息被丢弃,进一步说明加权平均型的合理性。

灵敏度分析段(回应主观性质疑,评审加分):

对模型中的主观设定进行灵敏度分析:当各因素权重在 ±10% 范围内扰动时,综合评价向量 BB 的最大分量始终为"优秀"且有效度 α\alpha 保持大于 0.5;当等级赋分由 [95,85,75,65,55][95,85,75,65,55] 调整为 [100,90,80,70,60][100,90,80,70,60] 时,综合得分由 90.31 变为 94.07,但对应等级仍为"优秀"。模型结论对主观设定不敏感,稳健性良好。

注:100×0.6591+90×0.2357+80×0.0825+70×0.0227=94.07100 \times 0.6591 + 90 \times 0.2357 + 80 \times 0.0825 + 70 \times 0.0227 = 94.07,供撰写灵敏度分析时参考;写论文前请用自己的实际运行数值替换。

八、延伸阅读

  1. 多级模糊综合评价:因素超过 6~8 个时把指标体系分层,自底向上逐层合成 B=A(B1;;BK)B = A \circ (B_1; \dots; B_K)。竞赛中"大指标体系"题目(如城市竞争力、企业绩效)的标准做法,能输出各准则层的中间评价结果,论文层次感更强。参考谢季坚《模糊数学方法及其应用》。
  2. 模糊层次分析法(FAHP):把 AHP 的 1-9 精确标度换成三角模糊数 a~=(l,m,u)\tilde{a} = (l, m, u)("大约 3 倍重要"),构造模糊判断矩阵,经去模糊化得到权重。解决"专家两两比较时说不清确切倍数"的问题,常与多级模糊综合评价搭配。可学习模糊数运算(三角模糊数的加法、乘法、去模糊化重心法)。
  3. 灰色综合评价:基于灰色关联度的评价方法,适合少数据、贫信息场景(样本只有几个评价对象)。与模糊综合评价形成互补:模糊处理"等级边界模糊",灰色处理"数据量不足",两者并列做交叉验证是竞赛常用写法。
  4. 直觉模糊集评价:直觉模糊集用隶属度 μ\mu、非隶属度 ν\nu 与犹豫度 π=1μν\pi = 1 - \mu - \nu 三个参数描述评价,比普通模糊集多刻画了"专家说不清、弃权"的信息,适合投票中有大量犹豫/弃权的情形,是模糊评价的前沿推广。
  5. 模糊 TOPSIS:把隶属度矩阵当作决策矩阵,在模糊环境中计算到正负理想解的距离并排序,实现"模糊评价"与"精确排序"的结合,是 FCE 与 TOPSIS 的直接融合,适合需要给出多个对象最终名次的题目。
  6. 推荐资源:谢季坚《模糊数学方法及其应用》(中文入门经典,隶属度与模糊综合评价推导完整);司守奎《数学建模算法与应用》("模糊综合评价"章节有竞赛化模板);姜启源《数学模型》(综合评价章节);韩中庚《数学建模方法及其应用》(评价方法横向对比);全国大学生数学建模竞赛历年优秀论文中评价类题目(搜索"模糊综合评价 优秀论文",重点看其隶属度矩阵与权重的构造细节)。