FCE (模糊综合评价)
处理“定性 + 不确定”的综合评价方法
模糊综合评价(Fuzzy Comprehensive Evaluation, FCE)基于模糊集合与隶属度的思想,把对多个指标的语言评价(或带不确定性的评分)表示为对各评价等级的隶属度,再通过权重与合成算子进行汇总,得到总体评价结果。
它常用于“很难精确定量、但又需要给出整体结论”的评价问题,尤其适合指标体系清晰、评价等级明确的场景。
适用场景
- 满意度/服务质量评价:问卷打分、客服质量、酒店/景区体验等。
- 风险与安全等级评估:项目风险、设备健康度、环境风险分级等。
- 综合能力评估:人员能力、教学质量、供应商综合评价等。
模型原理
设:
- 因素集(指标集)
- 评语集(等级集),例如
- 权重向量 ,满足
- 第 个指标对各等级的隶属度向量 ,通常满足
将所有指标的隶属度向量组成模糊关系矩阵:
通过合成算子得到综合评价向量(对等级集 的隶属度向量):
常见合成方式:
- 加权平均型:
- 最大-最小型:
得到 后常见输出方式:
- 最大隶属度原则:取 ,判定等级为
- 综合得分法:为等级集赋分 (例如 ),计算
主要步骤
- 建立指标体系与评价等级:确定因素集 与评语集 。
- 确定权重 :可用 AHP、熵权法、德尔菲法或专家经验等方法确定。
- 构造隶属度:将每个指标的观测值或语言评价映射为隶属度向量 。
- 建立模糊关系矩阵 :把 按行组成矩阵。
- 选择合成算子并计算 :得到综合评价向量。
- 输出结论:按最大隶属度原则给出等级,或按综合得分法给出得分与排名。
多级模糊综合评价
当指标体系层次较深(如一级指标下包含多个二级指标)时,可先对各一级指标内部做一次模糊综合评价,得到一级指标的评价向量,再把这些向量作为新的“指标”,进行第二次综合评价。
设第 个一级指标下对应的二级指标权重为 、隶属度矩阵为 ,先算:
再将所有 组成新的矩阵 ,结合一级指标权重 做第二次综合评价:
优缺点与注意事项
- 优点:能把“语言评价/不确定评分”转为可计算结果;支持多级指标体系;输出既可给等级也可给得分。
- 局限:隶属度函数与权重的设定带有主观性;对合成算子敏感;不同等级划分方式会影响结论。
- 实践建议:评语集等级不宜过多(通常 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.
- 模糊数学与模糊综合评价相关教材与课程讲义