Skip to content

FCE (模糊综合评价)

处理“定性 + 不确定”的综合评价方法

模糊综合评价(Fuzzy Comprehensive Evaluation, FCE)基于模糊集合与隶属度的思想,把对多个指标的语言评价(或带不确定性的评分)表示为对各评价等级的隶属度,再通过权重与合成算子进行汇总,得到总体评价结果。

它常用于“很难精确定量、但又需要给出整体结论”的评价问题,尤其适合指标体系清晰、评价等级明确的场景。

适用场景

  • 满意度/服务质量评价:问卷打分、客服质量、酒店/景区体验等。
  • 风险与安全等级评估:项目风险、设备健康度、环境风险分级等。
  • 综合能力评估:人员能力、教学质量、供应商综合评价等。

模型原理

设:

  • 因素集(指标集)
  • 评语集(等级集),例如
  • 权重向量 ,满足
  • 个指标对各等级的隶属度向量 ,通常满足

将所有指标的隶属度向量组成模糊关系矩阵

通过合成算子得到综合评价向量(对等级集 的隶属度向量):

常见合成方式:

  • 加权平均型
  • 最大-最小型

得到 后常见输出方式:

  • 最大隶属度原则:取 ,判定等级为
  • 综合得分法:为等级集赋分 (例如 ),计算

主要步骤

  1. 建立指标体系与评价等级:确定因素集 与评语集
  2. 确定权重 :可用 AHP、熵权法、德尔菲法或专家经验等方法确定。
  3. 构造隶属度:将每个指标的观测值或语言评价映射为隶属度向量
  4. 建立模糊关系矩阵 :把 按行组成矩阵。
  5. 选择合成算子并计算 :得到综合评价向量。
  6. 输出结论:按最大隶属度原则给出等级,或按综合得分法给出得分与排名。

多级模糊综合评价

当指标体系层次较深(如一级指标下包含多个二级指标)时,可先对各一级指标内部做一次模糊综合评价,得到一级指标的评价向量,再把这些向量作为新的“指标”,进行第二次综合评价。

设第 个一级指标下对应的二级指标权重为 、隶属度矩阵为 ,先算:

再将所有 组成新的矩阵 ,结合一级指标权重 做第二次综合评价:

优缺点与注意事项

  • 优点:能把“语言评价/不确定评分”转为可计算结果;支持多级指标体系;输出既可给等级也可给得分。
  • 局限:隶属度函数与权重的设定带有主观性;对合成算子敏感;不同等级划分方式会影响结论。
  • 实践建议:评语集等级不宜过多(通常 4–7 级);保证每一行隶属度和为 1;在论文中明确隶属度构造方法与等级赋分方案;必要时做敏感性分析(改权重/算子看结论是否稳定)。

完整代码实现(Python / MATLAB)

下面给出一份可以直接复用的 FCE 代码模板(以“加权平均型”为默认合成方式,同时提供最大-最小型作为备选)。

Python(NumPy)

python
import numpy as np

def normalize_weights(w):
    w = np.asarray(w, dtype=float).ravel()
    if np.any(w < 0):
        raise ValueError("错误:权重不能为负数!")
    s = np.sum(w)
    if s == 0:
        raise ValueError("错误:权重全为0,无法归一化!")
    return w / s

def normalize_rows(R):
    R = np.asarray(R, dtype=float)
    if np.any(R < 0):
        raise ValueError("错误:隶属度不能为负数!")
    row_sum = np.sum(R, axis=1, keepdims=True)
    if np.any(row_sum == 0):
        raise ValueError("错误:存在全0行,无法进行行归一化!")
    return R / row_sum

def fce_weighted_average(w, R):
    w = normalize_weights(w)
    R = normalize_rows(R)
    B = w @ R
    return B

def fce_max_min(w, R):
    w = normalize_weights(w)
    R = normalize_rows(R)
    W = w.reshape(-1, 1)
    B = np.max(np.minimum(W, R), axis=0)
    return B

def grade_by_max_membership(B, grades):
    B = np.asarray(B, dtype=float).ravel()
    idx = int(np.argmax(B))
    return grades[idx], idx

def score_by_grade_scores(B, scores):
    B = np.asarray(B, dtype=float).ravel()
    scores = np.asarray(scores, dtype=float).ravel()
    if B.shape[0] != scores.shape[0]:
        raise ValueError("错误:等级数量与赋分数量不一致!")
    return float(B @ scores)

if __name__ == "__main__":
    grades = ["优", "良", "中", "差"]
    grade_scores = [100, 80, 60, 40]

    w = [0.4, 0.35, 0.25]
    R = [
        [0.10, 0.60, 0.25, 0.05],
        [0.20, 0.50, 0.25, 0.05],
        [0.05, 0.55, 0.30, 0.10],
    ]

    B = fce_weighted_average(w, R)
    level, _ = grade_by_max_membership(B, grades)
    S = score_by_grade_scores(B, grade_scores)

    print("=== FCE 结果 ===")
    print("综合评价向量 B =", np.round(B, 4))
    print("等级判定 =", level)
    print("综合得分 =", round(S, 4))

MATLAB

matlab
clc, clear;

grades = {'优','良','中','差'};
grade_scores = [100, 80, 60, 40];

w = [0.4, 0.35, 0.25];
R = [
    0.10 0.60 0.25 0.05;
    0.20 0.50 0.25 0.05;
    0.05 0.55 0.30 0.10
];

if any(w < 0)
    error('错误:权重不能为负数!');
end
if any(R(:) < 0)
    error('错误:隶属度不能为负数!');
end

w = w / sum(w);
row_sum = sum(R, 2);
if any(row_sum == 0)
    error('错误:存在全0行,无法进行行归一化!');
end
R = R ./ row_sum;

B = w * R;
[~, idx] = max(B);
level = grades{idx};
S = B * grade_scores';

disp('=== FCE 结果 ===')
disp(['综合评价向量 B = [', num2str(B, ' %.4f'), ' ]'])
disp(['等级判定 = ', level])
disp(['综合得分 = ', num2str(S, '%.4f')])

参考资料

  • Zimmermann, H. J. Fuzzy Set Theory—and Its Applications.
  • 模糊数学与模糊综合评价相关教材与课程讲义