熵权法(Entropy Weight Method)的理论与代码实现¶
一、熵权法的基本原理¶
1️⃣ 核心思想¶
熵权法是一种客观赋权法,基于信息熵理论:
指标数据越离散,提供的信息越多,权重越大
这与主观赋权(如 AHP)正好相反。
2️⃣ 信息熵的数学定义¶
对于指标 $j$ :
$$E_j=−k_i\Sum_i^{m} p_{ij}lnp_{ij}$$其中:
m:样本数
pij=∑ixijxij
k=lnm1,保证 Ej∈[0,1]
3️⃣ 差异度与权重¶
- 差异度:
dj=1−Ej
- 熵权:
wj=∑j=1ndjdj
✅ 熵越小 → 信息量越大 → 权重越高
二、熵权法的标准计算流程¶
| 步骤 | 内容 |
|---|---|
| ① | 构造决策矩阵 Xm×n |
| ② | 数据正向化(统一效益型) |
| ③ | 标准化处理 |
| ④ | 计算各指标比重 |
| ⑤ | 计算信息熵 |
| ⑥ | 计算熵权 |
三、Python 实现(推荐版本 ✅)¶
✅ 1️⃣ 基础函数版(教学 & 快速使用)¶
import numpy as np
def entropy_weight(X, benefit_cols=None):
"""
熵权法计算指标权重
X: 原始数据矩阵 (m×n)
benefit_cols: 效益型指标索引(默认全部为效益型)
"""
X = np.array(X, dtype=float)
# 正向化处理(极小型 → 极大型)
if benefit_cols is None:
benefit_cols = list(range(X.shape[1]))
for j in range(X.shape[1]):
if j not in benefit_cols:
X[:, j] = X[:, j].max() - X[:, j]
# 标准化
X_norm = X / X.sum(axis=0)
# 防止 log(0)
eps = 1e-12
X_norm = np.clip(X_norm, eps, 1)
# 计算熵值
m, n = X.shape
k = 1 / np.log(m)
e = -k * (X_norm * np.log(X_norm)).sum(axis=0)
# 差异度 & 权重
d = 1 - e
w = d / d.sum()
return w, e
✅ 2️⃣ 面向对象版(工程推荐)¶
class EntropyWeight:
def __init__(self, data, benefit_cols=None):
self.X = np.array(data, dtype=float)
self.benefit_cols = benefit_cols or list(range(self.X.shape[1]))
def normalize(self):
for j in range(self.X.shape[1]):
if j not in self.benefit_cols:
self.X[:, j] = self.X[:, j].max() - self.X[:, j]
return self.X / self.X.sum(axis=0)
def fit(self):
P = self.normalize()
P = np.clip(P, 1e-12, 1)
m = P.shape[0]
e = -(1 / np.log(m)) * (P * np.log(P)).sum(axis=0)
d = 1 - e
return d / d.sum(), e
四、案例演示(城市综合评价)¶
📌 案例背景¶
评价 4 个城市的综合发展水平,指标如下:
| 指标 | 含义 | 类型 |
|---|---|---|
| GDP | 经济水平 | 效益型 |
| Pollution | 污染指数 | 成本型 |
| Hospital | 医疗资源 | 效益型 |
📊 原始数据¶
import pandas as pd
data = pd.DataFrame({
"GDP": [3000, 4500, 2800, 4000],
"Pollution": [60, 40, 80, 50],
"Hospital": [200, 300, 180, 260]
})
🧮 计算熵权¶
X = data.values
benefit_cols = [0, 2] # GDP, Hospital 为效益型
w, e = entropy_weight(X, benefit_cols)
print("熵值:", e)
print("熵权:", w)
📈 示例输出(示意)¶
熵值: [0.986 0.921 0.978]
熵权: [0.23 0.52 0.25 ]
✅ 结果解读¶
污染指数权重最高(0.52)
→ 数据离散程度最大,区分能力强
GDP 权重相对较低
→ 各城市差距不明显
说明:熵权法强调“谁最能拉开差距”
五、熵权法的特点总结¶
| 项目 | 说明 |
|---|---|
| 赋权性质 | 完全客观 |
| 是否依赖专家 | ❌ |
| 对异常值 | 敏感 |
| 数学基础 | 信息论 |
| 适用场景 | 大样本、多指标、数据驱动 |
六、熵权法 vs AHP¶
| 维度 | 熵权法 | AHP |
|---|---|---|
| 权重来源 | 数据本身 | 专家经验 |
| 客观性 | ✅ 高 | ❌ 低 |
| 一致性检验 | ❌ | ✅ |
| 小样本 | ❌ | ✅ |
| 可解释性 | 一般 | 强 |
七、常见组合用法(强烈推荐 ✅)¶
✔ 熵权 + AHP(主客观结合)¶
w=αwAHP+(1−α)wentropy
✔ 熵权 + TOPSIS¶
→ 用于综合排序(论文高频)
In [ ]:
Copied!