ITPub博客

首页 > > > 【R语言】熵权法确定权重

【R语言】熵权法确定权重

作者:浪花小雨滴 时间:2020-06-17 10:46:08 0 删除 编辑

张敬信:【评价算法】01. 熵权法确定权重​zhuanlan.zhihu.com图标

之前写过用 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)

结果与上篇文章也完全一样。


—————————————————————

原创作品,转载请注明,禁止用于出版。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3169588/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: R包制作填坑指南
请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39960