一、熵权法概述
熵,英文为entropy,是德国物理学家克劳修斯在1850年创造的一个术语,它用来表示一种能量在空间中分布的均匀程度。熵是热力学的一个物理概念,是体系混乱度(或无序度)的量度,用S表示。应用在系统论中,熵越大说明系统越混乱,携带的信息越少,熵越小说明系统越有序,携带的信息越多。
熵这一热力学概念最先由香农(C. E. Shannon)引入信息论,目前已经在工程技术、社会经济等领域得到了非常广泛的应用。
香农定义的信息熵是一个独立于热力学熵的概念,但具有热力学熵的基本性质(单值性、可加性和极值性),并且具有更为广泛和普遍的意义,所以称为广义熵。它是熵概念和熵理论在非热力学领域泛化应用的一个基本概念。
熵权法:一种客观赋权方法,它通过计算指标的信息熵,根据指标的相对变化程度对系统整体的影响来决定指标的权重,相对变化程度大的指标具有较大的权重,此方法现广泛应用在统计学等各个领域,具有较强的研究价值。
一般来说,若某个指标的信息熵 越小,表明指标值得变异程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的信息熵 越大,表明指标值得变异程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。
二、熵权法赋权步骤
我们将综合指标的重要性和指标提供的信息量这两方面来确定各指标的最终权重。
1. 数据标准化
a. 标准化处理:
其中, 为第
项指标值,
为第
项指标的最大值,为第
项指标的最小值, 为标准化值。
若所用指标的值越大/小越好,则选用前/后一个公式。
若有m个待评项目,n个评价指标,形成标准化后的原始数据矩阵 :
其中 为第
个指标下第
个项目的评价值。
b. 计算第 个指标下第
个项目的指标值的比重(先验概率)
:
由此,可以建立数据的比重矩阵
2. 求各指标的信息熵
计算第 个指标的熵权
:
式中,常数k为:
信息效用值 d为:
某项指标的信息效用价值取决于该指标的信息熵 与 1 之间的差值,它的值直接影响权重的大小,信息效用值越大,对评价的重要性就越大,权重也就越大。
3. 确定各指标权重
利用熵权法估算各指标的权重,其本质是利用该指标信息的价值系数来计算,其价值系数越高,对评价的重要性就越大(或称权重越大,对评价结果的贡献大)。
计算第 个指标的熵权
:
确定指标的综合权数 :
假设评估者根据自己的目的和要求将指标重要性的权重确定为 ,结合指标的熵权
就可以得到指标
的综合权数:
当各备选项目在指标 上的值完全相同时,该指标的熵达到最大值 1, 其熵权为零。这说明该指标未能向决策者提供有用的信息,即在该指标下,所有的备选项目对决策者来说是无差异的,可考虑去掉该指标。因此,熵权本身并不是表示指标的重要性系数,而是表示在该指标下对评价对象的区分度。
三、实例分析及Python代码
1. 背景介绍
某医院为了提高自身的护理水平,对拥有的11科室进行了考核,考核标准包括9项整体护理,并对护理水平较好的科室进行奖励。下表是对各个科室考核后的评分结果。
科室 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 |
---|---|---|---|---|---|---|---|---|---|
A | 100 | 90 | 100 | 84 | 90 | 100 | 100 | 100 | 100 |
B | 100 | 100 | 78.6 | 100 | 90 | 100 | 100 | 100 | 100 |
C | 75 | 100 | 85.7 | 100 | 90 | 100 | 100 | 100 | 100 |
D | 100 | 100 | 78.6 | 100 | 90 | 100 | 94.4 | 100 | 100 |
E | 100 | 90 | 100 | 100 | 100 | 90 | 100 | 100 | 80 |
F | 100 | 100 | 100 | 100 | 90 | 100 | 100 | 85.7 | 100 |
G | 100 | 100 | 78.6 | 100 | 90 | 100 | 55.6 | 100 | 100 |
H | 87.5 | 100 | 85.7 | 100 | 100 | 100 | 100 | 100 | 100 |
I | 100 | 100 | 92.9 | 100 | 80 | 100 | 100 | 100 | 100 |
J | 100 | 90 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
K | 100 | 100 | 92.9 | 100 | 90 | 100 | 100 | 100 | 100 |
但由于各项护理的难易程度不同,因此需要对9项护理进行赋权,以便能够更加合理地对各个科室的护理水平进行评价。
import numpy as np
li=[[100,90,100,84,90,100,100,100,100],
[100,100,78.6,100,90,100,100,100,100],
[75,100,85.7,100,90,100,100,100,100],
[100,100,78.6,100,90,100,94.4,100,100],
[100,90,100,100,100,90,100,100,80],
[100,100,100,100,90,100,100,85.7,100],
[100,100,78.6,100,90,100,55.6,100,100],
[87.5,100,85.7,100,100,100,100,100,100],
[100,100,92.9,100,80,100,100,100,100],
[100,90,100,100,100,100,100,100,100],
[100,100,92.9,100,90,100,100,100,100]]
li = np.array(li)
2. 熵权法进行赋权
1)数据标准化
根据原始评分表,对数据进行标准化后可以得到下列数据标准化表:
科室 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 |
---|---|---|---|---|---|---|---|---|---|
A | 1.00 | 0.00 | 1.00 | 0.00 | 0.50 | 1.00 | 1.00 | 1.00 | 1.00 |
B | 1.00 | 1.00 | 0.00 | 1.00 | 0.50 | 1.00 | 1.00 | 1.00 | 1.00 |
C | 0.00 | 1.00 | 0.33 | 1.00 | 0.50 | 1.00 | 1.00 | 1.00 | 1.00 |
D | 1.00 | 1.00 | 0.00 | 1.00 | 0.50 | 1.00 | 0.87 | 1.00 | 1.00 |
E | 1.00 | 0.00 | 1.00 | 1.00 | 1.00 | 0.00 | 1.00 | 1.00 | 0.00 |
F | 1.00 | 1.00 | 1.00 | 1.00 | 0.50 | 1.00 | 1.00 | 0.00 | 1.00 |
G | 1.00 | 1.00 | 0.00 | 1.00 | 0.50 | 1.00 | 0.00 | 1.00 | 1.00 |
H | 0.50 | 1.00 | 0.33 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
I | 1.00 | 1.00 | 0.67 | 1.00 | 0.00 | 1.00 | 1.00 | 1.00 | 1.00 |
J | 1.00 | 0.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
K | 1.00 | 1.00 | 0.67 | 1.00 | 0.50 | 1.00 | 1.00 | 1.00 | 1.00 |
li.min(axis=0)
# array([75. , 90. , 78.6, 84. , 80. , 90. , 55.6, 85.7, 80. ])
li.max(axis=0)
# array([100., 100., 100., 100., 100., 100., 100., 100., 100.])
li.max(axis=0) - li.min(axis=0)
# array([25. , 10. , 21.4, 16. , 20. , 10. , 44.4, 14.3, 20. ])
li_norm = (li-li.min(axis=0))/(li.max(axis=0)-li.min(axis=0))
li_norm = np.around(li_norm, decimals=2)
'''
array([[1. , 0. , 1. , 0. , 0.5 , 1. , 1. , 1. , 1. ],
[1. , 1. , 0. , 1. , 0.5 , 1. , 1. , 1. , 1. ],
[0. , 1. , 0.33, 1. , 0.5 , 1. , 1. , 1. , 1. ],
[1. , 1. , 0. , 1. , 0.5 , 1. , 0.87, 1. , 1. ],
[1. , 0. , 1. , 1. , 1. , 0. , 1. , 1. , 0. ],
[1. , 1. , 1. , 1. , 0.5 , 1. , 1. , 0. , 1. ],
[1. , 1. , 0. , 1. , 0.5 , 1. , 0. , 1. , 1. ],
[0.5 , 1. , 0.33, 1. , 1. , 1. , 1. , 1. , 1. ],
[1. , 1. , 0.67, 1. , 0. , 1. , 1. , 1. , 1. ],
[1. , 0. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ],
[1. , 1. , 0.67, 1. , 0.5 , 1. , 1. , 1. , 1. ]])
'''
2)求各指标的信息熵
根据信息熵的计算公式 ,可以计算出9项护理指标各自的信息熵如下:
e1 | e2 | e3 | e4 | e5 | e6 | e7 | e8 | e9 | |
---|---|---|---|---|---|---|---|---|---|
信息熵 | 0.95 | 0.87 | 0.84 | 0.96 | 0.94 | 0.96 | 0.96 | 0.96 | 0.96 |
li_norm.sum(axis=0)
# array([ 9.5 , 8. , 6. , 10. , 6.5 , 10. , 9.87, 10. , 10. ])
pij = li_norm / li_norm.sum(axis=0)
m, n = li_norm.shape
k = 1 / np.log(m)
tmp = pij*np.log(pij)
tmp = np.nan_to_num(tmp)
ej = -k * (tmp.sum(axis=0))
# array([0.95, 0.87, 0.84, 0.96, 0.94, 0.96, 0.96, 0.96, 0.96])
3)计算各指标的权重
根据指标权重的计算公式 ,可得到各个指标的权重如下:
W1 | W2 | W3 | W4 | W5 | W6 | W7 | W8 | W9 | |
---|---|---|---|---|---|---|---|---|---|
权重 | 0.08 | 0.22 | 0.27 | 0.07 | 0.11 | 0.07 | 0.07 | 0.07 | 0.07 |
wi = (1 - ej) / np.sum(1 - ej)
wi = np.around(wi, decimals=2)
# array([0.08, 0.22, 0.27, 0.07, 0.1 , 0.07, 0.07, 0.07, 0.07])
3. 对各个科室进行评分
根据计算出的指标权重,以及对11个科室9项护理水平的评分。设 为第
个科室的最终得分,则最终得分的计算方法为:
这里为了避免人工赋权的干扰,将人工权重都设为1。
# 引入人工权重
h = np.array([1,1,1,1,1,1,1,1,1])
# 计算综合权重
b = (h * wi)/((h * wi).sum())
# 计算最终得分
scores = np.around((b * li).sum(axis=1), decimals=2)
# array([95.76, 93.35, 93.27, 92.97, 95.78, 98.04, 90.31, 95.23, 96.16, 97.84, 97.14])
各个科室最终得分如下表所示:
科室 | A | B | C | D | E | F | G | H | I | J | K |
---|---|---|---|---|---|---|---|---|---|---|---|
得分 | 95.76 | 93.35 | 93.27 | 92.97 | 95.78 | 98.04 | 90.31 | 95.23 | 96.16 | 97.84 | 97.14 |
四、代码模块化
将以上Python代码整理后,变为以下可以复用的版本:
# -*- encoding=utf-8 -*-
import numpy as np
def entropy(data, hweights):
data_norm = (data-data.min(axis=0))/(data.max(axis=0)-data.min(axis=0))
data_norm = np.around(data_norm, decimals=2)
pij = data_norm / data_norm.sum(axis=0)
m, n = data_norm.shape
k = 1 / np.log(m)
tmp = pij*np.log(pij)
tmp = np.nan_to_num(tmp)
ej = -k * (tmp.sum(axis=0))
wi = (1 - ej) / np.sum(1 - ej)
wi = np.around(wi, decimals=2)
b = (hweights * wi)/((hweights * wi).sum())
scores = np.around((b * data).sum(axis=1), decimals=2)
return scores
if __name__ == '__main__':
li=[[100,90,100,84,90,100,100,100,100],
[100,100,78.6,100,90,100,100,100,100],
[75,100,85.7,100,90,100,100,100,100],
[100,100,78.6,100,90,100,94.4,100,100],
[100,90,100,100,100,90,100,100,80],
[100,100,100,100,90,100,100,85.7,100],
[100,100,78.6,100,90,100,55.6,100,100],
[87.5,100,85.7,100,100,100,100,100,100],
[100,100,92.9,100,80,100,100,100,100],
[100,90,100,100,100,100,100,100,100],
[100,100,92.9,100,90,100,100,100,100]]
li = np.array(li)
h = np.array([1,1,1,1,1,1,1,1,1])
rlt = entropy(data=li, hweights=h)
print(rlt)
五、总结
- 熵权法与上一篇中的变异系数法有接近的思想,都是根据指标值差异的程度来计算权重系数,不同的是熵权法引入了信息熵的概念,增加了权重计算过程的非线性。
- 根据信息论的基本原理,信息是系统有序程度的一个度量;而熵是系统无序程度的一个度量。
- 若系统可能处于多种不同的状态。而每种状态出现的概率为
时,即各种状态出现的概率相同时,熵取最大值,为:
- 从信息熵的公式可以看出:如果某个指标的熵权
越小/大,说明其指标值的变异程度越大/小,提供的信息量越多/少,在综合评价中该指标起的作用越大/小,其权重应该越大/小。
- 熵权法适用于任何评价问题中的确定指标权重;可用于剔除指标体系中对评价结果贡献不大的指标。
熵权法优点:
- 客观性:相对那些主观赋值法,精度较高 ,客观性更强,能够更好地解释所得到的结果。
- 适应性:可以用于任何需要确定权重的过程,也可以结合一些方法共同使用。
熵权法缺点:
- 目前为止,熵权法只在确定权重的过程中使用,所以使用范围有限,解决的问题有限。