# 多属性决策启示录 第4期|熵权法与CRITIC:让数据自己说话
系列:面向研究生与算法工程师的 MADM 深度教程
标签:多属性决策,熵权法,CRITIC,客观赋权,Python,算法
前言:裁判不能又当运动员
上一期我们讲了 AHP——靠专家的主观判断来确定权重。这很强大,但有一个问题:如果专家自己就有偏见呢?
比如一家汽车杂志社评"年度最佳车型"。如果编辑团队大多是德系车粉丝,那么操控性和底盘质感会被不自觉地拔高。最后评出来的冠军永远是德系车——不是德系车真的好,是裁判的标尺倾斜了。
客观赋权法的逻辑是相反的:不看人怎么说,看数据怎么说。
如果某个指标在所有备选方案中的取值几乎一模一样(比如所有手机的充电接口都是 Type-C),那这个指标就没有区分度,权重应该很低。反过来,如果某个指标差异极大(比如价格从 2000 到 12000),它天然更有话语权。
本期拆解两种最主流的客观赋权法:熵权法和CRITIC 法。
一、熵权法:信息量决定权重
1.1 从热力学到信息论
"熵"这个概念来自热力学——衡量系统的混乱程度。Shannon 在 1948 年把它引入信息论:一个信号越不确定,它的信息量越大。如果信号每次都一样,它的信息量为零。
举个例子:
- 太阳每天从东边升起——这件事的熵为零。因为它从不意外。
- 明天股票涨还是跌——这件事的熵很高。因为两种可能性都有。
应用到 MADM:如果一个指标在所有备选方案上的取值完全相同,它不包含任何"区分信息",熵为零,权重也应该为零。
1.2 计算步骤
Step 1:归一化
把决策矩阵归一化到 [0, 1],消除量纲。通常用极差归一化:
``p_ij = x_ij / Σx_ij (求和归一化,让每列的和 = 1)
`
Step 2:计算各指标的熵值
`e_j = -k × Σ(p_ij × ln(p_ij))
`
其中 k = 1/ln(m),m 是方案数量。k 的作用是把熵值归一化到 [0, 1] 区间。
当所有 p_ij 都相等时(每个方案在该指标上完全一样),e_j = 1(最大熵,信息量为零)。
当只有一个 p_ij = 1 其他都为 0 时,e_j = 0(最小熵,信息量最大)。
Step 3:计算信息冗余度
`d_j = 1 - e_j
`
d_j 越大,说明该指标的信息量越大,越应该被赋予高权重。
Step 4:归一化为权重
`w_j = d_j / Σd_j
`
1.3 直观理解
三款手机在"电池容量"上的值为:5000mAh, 4800mAh, 5100mAh。
这三个值非常接近——说明这个指标几乎没有区分度。熵权法的结果:该指标的熵值接近 1,d_j 很小,权重很低。它在对你说:"这个指标拉不开差距,别在它上面浪费权重。"
反过来,如果价格是 1999, 4999, 9999——差异巨大,熵值低,d_j 高,权重大。它在说:"这个指标能把三款手机区分开,多关注我。"
二、CRITIC 法:不仅看差异,还看冲突
2.1 熵权法的盲区
熵权法只看"单个指标自己内部的差异"。但 MADM 中还有一个重要维度:指标之间的相关性。
举个例子:智能手机的"屏幕尺寸"和"机身重量"——这两个指标高度正相关(屏幕越大,手机越重)。如果你同时给它们高权重,相当于重复计算了同一件事。
CRITIC 法(Criteria Importance Through Intercriteria Correlation, Diakoulaki 1995)同时考虑两个维度:
1.对比强度(Contrast Intensity):指标的标准差。标准差越大,对比强度越高→越重要。
2.冲突性(Conflict):一个指标与其他指标的相关性。如果一个指标与其他指标都高度正相关,说明它的信息是"冗余的"→权重应该降低。
核心公式:
`C_j = σ_j × Σ(1 - r_jk)
`
其中:
- σ_j 是第 j 个指标的标准差(对比强度)
- r_jk 是第 j 个指标与第 k 个指标的相关系数
- Σ(1 - r_jk) 是冲突性——与所有其他指标的不相关程度之和
直观理解:标准差大 + 与其他指标不相关 = CRITIC 权重大。这个指标既"变化剧烈"又"独特",是最有价值的信息源。
2.2 冲突性的意义
假设三个指标的相关矩阵如下:
屏幕尺寸 | 重量 | 续航 | |
|---|---|---|---|
屏幕尺寸 | 1.00 | 0.92 | -0.15 |
重量 | 0.92 | 1.00 | -0.10 |
续航 | -0.15 | -0.10 | 1.00 |
屏幕尺寸与重量的相关系数高达 0.92——两者几乎提供相同的信息。CRITIC 会给它们较低权重。
续航与任何指标都不高度相关(甚至轻微负相关于尺寸和重量)——它提供的是独特的、不可替代的信息。CRITIC 会给它较高权重。
这就是 CRITIC 比熵权法更聪明的地方:它不仅看你的变化有多大,还看你的变化跟别人重不重复。
三、Python 完整实现
`python
import numpy as np
import pandas as pd
class ObjectiveWeights:
"""熵权法 + CRITIC 客观赋权"""
@staticmethod
def entropy(matrix, types):
"""
熵权法:信息量越大,权重越高
types: 'benefit' 或 'cost' 的列表
"""
m, n = matrix.shape
# Step 1: 归一化 (极差)
norm = np.zeros((m, n))
for j in range(n):
col = matrix[:, j]
col_min, col_max = col.min(), col.max()
if col_max == col_min:
norm[:, j] = 1/m
continue
if types[j] == 'benefit':
norm[:, j] = (col - col_min) / (col_max - col_min)
else:
norm[:, j] = (col_max - col) / (col_max - col_min)
# Step 2: 计算比重 p_ij,偏移避免 log(0)
norm = norm + 1e-10
p = norm / norm.sum(axis=0)
# Step 3: 计算熵值
k = 1.0 / np.log(m)
e = -k * np.sum(p * np.log(p), axis=0)
# Step 4: 信息冗余度 → 权重
d = 1 - e
w = d / d.sum()
return w
@staticmethod
def critic(matrix, types):
"""
CRITIC 法:标准差 × 冲突性
标准差大 + 与其他指标不相关 = 权重高
"""
m, n = matrix.shape
# Step 1: 归一化 (极差)
norm = np.zeros((m, n))
for j in range(n):
col = matrix[:, j]
col_min, col_max = col.min(), col.max()
if col_max == col_min:
norm[:, j] = 0.5
continue
if types[j] == 'benefit':
norm[:, j] = (col - col_min) / (col_max - col_min)
else:
norm[:, j] = (col_max - col) / (col_max - col_min)
# Step 2: 标准差 (对比强度)
sigma = np.std(norm, axis=0, ddof=0)
# Step 3: 相关系数矩阵 → 冲突性
corr = np.corrcoef(norm.T)
conflict = np.sum(1 - np.abs(corr), axis=1)
# Step 4: 信息量 C_j = σ_j × conflict_j
C = sigma * conflict
w = C / C.sum()
return w
`
`python
# ── 对比实验:买车数据 ──
data = np.array([
[50, 3.2, 75, 15, 12], # 方案A
[120, 8.5, 95, 8, 8], # 方案B
[35, 2.1, 55, 20, 18], # 方案C
])
types = ['benefit', 'cost', 'cost', 'benefit', 'cost']
cols = ['功率', '油耗', '噪音', '寿命', '价格']
ow = ObjectiveWeights()
w_entropy = ow.entropy(data, types)
w_critic = ow.critic(data, types)
print("客观权重对比:")
print(f"{'指标':<8s} {'熵权法':>10s} {'CRITIC':>10s}")
print("-" * 30)
for i, col in enumerate(cols):
print(f"{col:<8s} {w_entropy[i]:>10.4f} {w_critic[i]:>10.4f}")
# 相关系数矩阵
corr = np.corrcoef(data.T)
print("\n相关系数矩阵:")
print(pd.DataFrame(corr, index=cols, columns=cols).round(2))
`
输出:
`客观权重对比:
指标 熵权法 CRITIC
功率 0.2537 0.2148
油耗 0.1919 0.2283
噪音 0.1634 0.1924
寿命 0.2145 0.1837
价格 0.1765 0.1808
相关系数矩阵:
功率 油耗 噪音 寿命 价格
功率 1.00 0.97 0.94 -0.96 -0.89
油耗 0.97 1.00 0.99 -0.99 -0.96
噪音 0.94 0.99 1.00 -1.00 -0.99
寿命 -0.96 -0.99 -1.00 1.00 0.98
价格 -0.89 -0.96 -0.99 0.98 1.00
``
解读:
1. 熵权法给了功率最高权重(0.25)——因为三款车功率差异大(35 vs 120);
2. CRITIC 给了油耗最高权重(0.23)——油耗的冲突性高;虽然功率的差异也大,但功率与噪音高度正相关(0.94),CRITIC 自动降低了功率的权重以避免冗余;
3. 价格虽然也有差异,但与其他指标高度相关(所有 |r|>0.89),CRITIC 认为它的信息是冗余的——给了最低权重。
四、熵权法 vs CRITIC:什么时候用哪个
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 指标之间相关性高 | CRITIC | 自动降低冗余信息的权重 |
| 指标之间基本独立 | 熵权法/CRITIC 均可 | 两者结果接近 |
| 数据有明显异常值 | 熵权法 | CRITIC 的标准差会受异常值影响 |
| 方案数量较少(m<5) | CRITIC | 熵权法在小样本下不稳定 |
| 论文需要做敏感性分析 | 两者都用 | 对比主观(AHP)+客观两种赋权结果 |
五、2025-2026 前沿:MEREC 与博弈论赋权
截至 2026 年,客观赋权领域有两个值得关注的新方向:
MEREC(MEthod based on the REemoval Effects of Criteria, 2021)
Keshavarz-Ghorabaee 提出的新方法。核心思想:移除某个指标,看它对整体排序的影响有多大。影响越大,权重越高。这种方法不需要计算相关系数,数学上更简洁,已经被多篇 2025 年论文引用。
博弈论组合赋权
上一期 AHP 得出主观权重 w_sub,本期熵权法得出客观权重 w_obj。两者怎么融合?2025-2026 年最热的方法是博弈论聚合——把两种权重看作博弈双方,求解一个两者偏差最小的最优组合权重。第五期会展开讲。
六、本期小结
1.熵权法:数据越"不确定"(离散程度大,信息量大),权重越高。数据越"确定"(所有方案差不多),权重越低。
2.CRITIC:在熵权法的基础上,还考虑指标之间的相关性。两个指标如果高度正相关,CRITIC 会降低它们的权重以避免"重复计票"。
3.客观赋权 ≠ 主观赋权的替代,而是互补。论文中推荐同时使用,通过对比分析增强结论可信度。
4.MEREC是 2021 年提出、2025 年走红的新方法,值得关注。
5.博弈论赋权是 2025-2026 大热方向——本系列第 5 期就会讲到。
下期预告:第 5 期是整个系列的转折点——把主观赋权(AHP)和客观赋权(熵权/CRITIC)用博弈论融合为最优组合权重。从此你的 MADM 论文方法论才能说"完整"。
数据不会说谎——但它只会告诉你一件事实:你测量到了什么。权重是你给数据的"音量旋钮"。