指标权重确定方法之熵权法
from http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html
一、熵权法介绍
熵最先由申农引入信息论,目前已经在工程技术、社会经济等领域得到了非常广泛的应用。
熵权法的基本思路是根据指标变异性的大小来确定客观权重。
一般来说,若某个指标的信息熵越小,表明指标值得变异程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的信息熵越大,表明指标值得变异程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。
二、熵权法赋权步骤
1. 数据标准化
将各个指标的数据进行标准化处理。
假设给定了k个指标,其中。假设对各指标数据标准化后的值为,那么。
2. 求各指标的信息熵
根据信息论中信息熵的定义,一组数据的信息熵。其中,如果,则定义。
3. 确定各指标权重
根据信息熵的计算公式,计算出各个指标的信息熵为 。通过信息熵计算各指标的权重: 。
三、熵权法赋权实例
1. 背景介绍
某医院为了提高自身的护理水平,对拥有的11个科室进行了考核,考核标准包括9项整体护理,并对护理水平较好的科室进行奖励。下表是对各个科室指标考核后的评分结果。
但是由于各项护理的难易程度不同,因此需要对9项护理进行赋权,以便能够更加合理的对各个科室的护理水平进行评价。
2. 熵权法进行赋权
1)数据标准化
根据原始评分表,对数据进行标准化后可以得到下列数据标准化表
表2 11个科室9项整体护理评价指标得分表标准化表
科室 |
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 |
2)求各指标的信息熵
根据信息熵的计算公式 ,可以计算出9项护理指标各自的信息熵如下:
表3 9项指标信息熵表
|
X1 |
X2 |
X3 |
X4 |
X5 |
X6 |
X7 |
X8 |
X9 |
信息熵 |
0.95 |
0.87 |
0.84 |
0.96 |
0.94 |
0.96 |
0.96 |
0.96 |
0.96 |
3)计算各指标的权重
表4 9项指标权重表
|
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 |
3. 对各个科室进行评分
根据计算出的指标权重,以及对11个科室9项护理水平的评分。设Zl为第l个科室的最终得分,则 ,各个科室最终得分如下表所示
表5 11个科室最终得分表
科室 |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
得分 |
95.71 |
93.14 |
93.17 |
92.77 |
95.84 |
98.01 |
90.21 |
95.17 |
95.97 |
97.81 |
97.02 |
1个回复
-
xsmile
from https://zhuanlan.zhihu.com/p/115411437
之前写过用 Matlab 实现熵权法确定权重,再补充一个 R 语言实现(代码更加的简洁),算法原理步骤看上面这篇文章就行,不再赘述。
顺便说一句,R语言我用的越来越顺手,它的灵活和强大让我都不大愿意用 Matlab了。
1. 先定义归一化函数
因为熵权法归一化值不能出现 0 或 1,多往内收缩一下到 [0.002, 0.996], 需要的话可自行修改。
## 定义归一化函数 Rescale = function(x, type=1) { # type=1正向指标, type=2负向指标 rng = range(x, na.rm = TRUE) if (type == 1) { (0.996 - 0.002) * (x - rng[1]) / (rng[2] - rng[1]) + 0.002 } else { (0.996 - 0.002) * (rng[2] - x) / (rng[2] - rng[1]) + 0.002 } }
测试函数:
x <- c(1, 2, 3, NA, 5) Rescale(x)
2. 定义熵权法赋权函数
Entropy_Weight = function(X, index) { # 实现用熵权法计算各指标(列)的权重及各数据行的得分 # X为指标数据, 一行代表一个样本, 每列对应一个指标 # index指示向量,指示各列正向指标还是负向指标,1表示正向指标,2表示负向指标 # s返回各行(样本)得分,w返回各列权重 pos = which(index == 1) neg = which(index != 1) # 数据归一化 X[,pos] = lapply(X[,pos], Rescale, type=1) X[,neg] = lapply(X[,neg], Rescale, type=2) # 计算第j个指标下,第i个样本占该指标的比重p(i,j) P = data.frame(lapply(X, function(x) x / sum(x))) # 计算第j个指标的熵值e(j) e = sapply(P, function(x) sum(x * log(x)) *(-1/log(nrow(P)))) d = 1 - e # 计算信息熵冗余度 w = d / sum(d) # 计算权重向量 # 计算样本得分 s = as.vector(100 * as.matrix(X) %*% w) list(w=w, s=s) }
测试函数:
仍使用上一篇文章同样的数据:shang_datas.xlsx, 为2014年31个省份的就业与劳动保障数据, 包含5个指标:社会养老保险参保率、医疗保险参保率、失业保险参保率、工伤保险参保率、工伤事故发生率, 其中第5个指标为负向指标。
library(readxl) data = read_xlsx("shang_datas.xlsx") X = data[, 2:6] ind = c(1,1,1,1,2) Entropy_Weight(X, ind)
结果与上篇文章也完全一样。
2年前 我来评论