熵权法求指标权重的计算算式及其R语言实现

前言

熵权法是一种常见的用来确定综合评价问题中指标权重的方法。最近笔者在参与某项目时需要用到这一方法,因此在网上搜索了有关信息,希望能够

  • 明确熵权法的计算算式;
  • 得到熵权法的一个简单、高效的R语言程序实现;
  • 通过应用实例来验证上述算式和程序的正确性。

遗憾的是,笔者搜索到的各种资料均无法同时满足上述需求。因此,笔者围绕上述要点写下了这篇文章。

本文不会对熵权法的原理及应用步骤(例如数据的标准化)进行深入地探讨,感兴趣的读者可以参阅有关文献,比如 (任广平, 邹志红, and 孙靖南 2005)

熵权法的计算算式

现假设一个已经过标准化的数据集\(r_{ij}\)\(m\)个被评价对象和\(n\)个评价指标(\(i = 1, ..., m; j = 1, ..., n\)),则第\(j\)个指标的熵值\(H_j\)的定义为

\[ H_j = -k\sum_{i=1}^{m}{f_{ij} ln(f_{ij})} \]

其中

\[ f_{ij} = \frac{r_{ij}}{\sum_{i=1}^{m}r_{ij}}, \\ k = \frac{1}{ln(m)} \]

在计算出熵值后,即可根据下式计算对应的指标权重\(w_j\)

\[ w_j = \frac{1 - H_j}{n - \sum_{j = 1}^{n}{H_j}} \]

熵权法的R语言实现

根据上一节所给出的算式,可编写以下函数用于计算给定数据集中各指标的权重:

entropy_weight <- function(r_ij) {
  # 输入参数r_ij为一个m*n的纯数值矩阵;其中m代表样本量(行数),n代表指标数(列数)
  # 如果对象类型为数据框(dataframe),可以先使用as.matrix()函数将其转换成矩阵
  stopifnot(is.matrix(r_ij), is.numeric(r_ij)) # 如果输入不是纯数值矩阵,则终止程序
  m <- nrow(r_ij)
  n <- ncol(r_ij)
  k <- 1 / log(m)
  f_ij <- t(t(r_ij) / colSums(r_ij))
  H_j <- -k * colSums(f_ij * ifelse(f_ij == 0, 0, log(f_ij)))
  w <- (1 - H_j) / (n - sum(H_j))
  w
}

应用实例

以下是一份来自 任广平, 邹志红, and 孙靖南 (2005)1的数据集(见该文献表2):

r_ij <- matrix(
  c(0.105, 0.474, 0.368, 0.316, 0.316, 0.158, 0.474, 0.368, 0.842, 0.632, 1.000, 0.947, 0.000,
    0.593, 0.593, 0.519, 0.481, 1.000, 0.222, 0.333, 0.593, 0.111, 0.000, 0.111, 0.407, 0.222,
    0.708, 0.308, 0.083, 0.000, 0.125, 0.917, 1.000, 0.600, 0.067, 0.683, 0.392, 0.333, 0.642,
    1.000, 0.000, 0.579, 0.526, 0.105, 0.368, 0.474, 0.263, 0.158, 0.368, 0.368, 0.263, 0.895,
    0.655, 0.195, 0.000, 0.164, 0.425, 0.473, 0.451, 0.447, 1.000, 0.451, 0.465, 0.429, 0.429),
  ncol = 5
)
print(r_ij)
##        [,1]  [,2]  [,3]  [,4]  [,5]
##  [1,] 0.105 0.593 0.708 1.000 0.655
##  [2,] 0.474 0.593 0.308 0.000 0.195
##  [3,] 0.368 0.519 0.083 0.579 0.000
##  [4,] 0.316 0.481 0.000 0.526 0.164
##  [5,] 0.316 1.000 0.125 0.105 0.425
##  [6,] 0.158 0.222 0.917 0.368 0.473
##  [7,] 0.474 0.333 1.000 0.474 0.451
##  [8,] 0.368 0.593 0.600 0.263 0.447
##  [9,] 0.842 0.111 0.067 0.158 1.000
## [10,] 0.632 0.000 0.683 0.368 0.451
## [11,] 1.000 0.111 0.392 0.368 0.465
## [12,] 0.947 0.407 0.333 0.263 0.429
## [13,] 0.000 0.222 0.642 0.895 0.429

上述数据集中的数值已经经过标准化处理,因此可直接应用前面所定义的函数来计算各个指标的权重:

entropy_weight(r_ij)

其计算结果是

## [1] 0.2024203 0.2024094 0.2498016 0.2034372 0.1419315

上述计算结果与该参考文献表3中所列的结果一致,所以可以认为本文所提供的熵权法算式和程序是正确的。

参考文献

任广平, 邹志红, and 孙靖南. 2005. “模糊评价因子的熵权法赋权及其在水质评价中的应用.” 环境科学学报, no. 04: 552–56.


  1. 细心的读者可能会发现本文所给出的熵权计算算式与参考文献所给出的算式在表达上有些许差异;再仔细看会发现其实是符号\(i\)\(j\)\(m\)\(n\)进行了对调,这不会影响计算结果。

下一页
上一页
comments powered by Disqus