Loading...
墨滴

傲天居士

2021/07/05  阅读:43  主题:默认主题

R语言熵权法

1. 熵权法

熵最先由香农引入信息论,目前已经在自然科学、人文社科等领域得到了广泛的应用。熵权法的基本思路是根据指标的变异性确定客观权重。一般地,若某个指标的信息熵 越小,指标值变异程度越大,提供的信息量越多,在综合评价中所能起到的作用越大,其权重也就越大。反之,某个指标的信息熵越大,指标变异程度越小,提供的信息量越少,在综合评价中所起到的作用越小,其权重也就越小。

1.1 熵权法的计算步骤

  1. 数据归一化

    给定一系列指标 , 其中 . 我们将归一化后的指标记为 . 如果 是一个正向指标, 归一化的操作如公式(1):

    否则:

    1. 计算信息熵

    我么定义 ,如公式(3):

    指标 的信息熵按如下方式计算,公式(4): 如果 , 我们可以定义

  1. 计算指标权重

根据公式(4), 我们可以得到每个指标的信息熵,即 . 因此,每个指标的权重,见公式(5):

4. 计算得分

既然得到了指标权重,我们就可以基于归一化的数据计算得分,如公式(6):

其中 ,

1.2 在R中使用熵权法

rm(list=ls())
# 加载数据
load('mypath//myfile.Rdata')
# 定义归一化函数
Rescale = function(x, type=1) {
  # type=1正向指标, type=2负向指标
  rng = range(x, na.rm = TRUE)
  if (type == 1) {
    (x - rng[1]) / (rng[2] - rng[1]) 
  } else {
    (rng[2] - x) / (rng[2] - rng[1])
  }
}
#定义熵值函数
Entropy = function(x) {
  entropy=array(data = NA, dim = ncol(x),dimnames = NULL)
  
  j=1
  while (j<=ncol(x)) {
    value=0
    i=1
    while (i<=nrow(x)) {
      if (x[i,j]==0) {
        (value=value) 
      } else {
        (value=value+x[i,j]*log(x[i,j]))
      }
      i=i+1
    }
    entropy[j]=value*(-1/log(nrow(x))) 
    j=j+1
  }
  
  return(entropy)
}
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)))
  
  e = Entropy(P)
  d = 1 - e         # 计算信息熵冗余度
  w = d / sum(d)   # 计算权重向量
  
  # 计算样本得分
  s = as.vector(100 * as.matrix(X) %*% w)
  
  
  list(w=w,s=s)
  
}
# 赋予指标属性,如
ind=array(1,1,1,2,2,1,2,1,1)
# 调用EWM函数
aa=Entropy_Weight(data,ind)
# 计算得分
score=as.data.frame(aa["s"])
# 计算权重
weight=as.data.frame(aa["w"])

傲天居士

2021/07/05  阅读:43  主题:默认主题

作者介绍

傲天居士