数学建模-熵权法

数学建模-熵权法

Mel0ny Lv5

熵权法

目的是为了给各个指标顶权重

指标数据离散程度越大,对综合评价的区分作用越强,权重越高

物理熵与信息熵关系

信息熵各个名词之间的关系

信息熵:信息熵值反映了一个离散随机变量X的平均信息度,为了确定一个信号中包含了多少信息
信息效用值:包含了多少有效信息
熵权:根据信息熵定的权重

思路流程图

graph LR
a(**概率值**离散程度越大,**信息熵**越小) --> b(**信息熵**越小,**信息效用值**越大)
b --> c(**信息效用值**越大,**有用信息量**越大)
c --> d(**有用信息量**越大,**权重**越大)

求解步骤

1.正向化

同Topsis法,将指标归正

2.标准化

3.归一化

4.求信息熵,信息效用值,进而求熵权

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np  # 导入numpy库,并简称为np

# 熵权法计算权重

# 定义一个自定义的对数函数mylog,用于处理输入数组中的零元素
def mylog(p):
n = len(p) # 获取输入向量p的长度
lnp = np.zeros(n) # 创建一个长度为n,元素都为0的新数组lnp
for i in range(n): # 对向量p的每一个元素进行循环
if p[i] == 0: # 如果当前元素的值为0
lnp[i] = 0 # 则在lnp中对应位置也设置为0,因为log(0)是未定义的,这里我们规定为0
else:
lnp[i] = np.log(p[i]) # 如果p[i]不为0,则计算其自然对数并赋值给lnp的对应位置
return lnp # 返回计算后的对数数组

# 定义一个指标矩阵X
X = np.array([[5/7, 1/3, 2/3], [0, 1, 1/3], [1, 0, 1], [3/7, 2/3, 0]])

Z = X / np.sqrt(np.sum(X**2, axis=0))

print("标准化矩阵 Z = ")
print(Z) # 打印标准化矩阵Z

# 计算熵权所需的变量和矩阵初始化
n, m = Z.shape # 获取标准化矩阵Z的行数和列数
D = np.zeros(m) # 初始化一个长度为m的数组D,用于保存每个指标的信息效用值

# 计算每个指标的信息效用值
for i in range(m): # 遍历Z的每一列
x = Z[:, i] # 获取Z的第i列,即第i个指标的所有数据
p = x / np.sum(x) # 对第i个指标的数据进行归一化处理,得到概率分布p
print(p)
# 使用自定义的mylog函数计算p的对数。需要注意的是,如果p中含有0,直接使用np.log会得到-inf,这里使用自定义函数避免这个问题
e = -np.sum(p * mylog(p)) / np.log(n) # 根据熵的定义计算第i个指标的信息熵e
D[i] = 1 - e # 根据信息效用值的定义计算D[i]

# 根据信息效用值计算各指标的权重
W = D / np.sum(D) # 将信息效用值D归一化,得到各指标的权重W

print("权重 W = ")
print(W) # 打印得到的权重数组W
  • 标题: 数学建模-熵权法
  • 作者: Mel0ny
  • 创建于 : 2025-11-07 00:18:57
  • 更新于 : 2025-11-07 20:56:22
  • 链接: https://mel0nyrame.github.io/2025/11/07/数学建模-熵权法/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论