如何使用熵权法计算指标权重

数学与统计学
作者

zenggyu

发布于

2019-10-28

摘要
介绍熵权法的计算方式,并提供R语言实现。

引言

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

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

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

数据预处理

在使用熵权法的算式计算权重之前,需要先对数据进行标准化。设\(x_{ij}\)为第\(i\)个评价对象在第\(j\)个评价指标上的原始值、\(r_ij\)为其对应的标准值,则对高优指标而言,有

\[ r_{ij} = \frac{x_{ij} - min\{x_{j}\}}{max\{x_{j}\} - min\{x_{j}\}} \]

而对低优指标而言,有

\[ r_{ij} = \frac{max\{x_{j}\} - x_{ij}}{max\{x_{j}\} - min\{x_{j}\}} \]

熵权法的计算算式

现假设一个已经过标准化的数据集\(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_weights <- 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
}

应用实例

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

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

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_weights(r_ij)

其计算结果是

## [1] 0.2024203 0.2024094 0.2498016 0.2034372 0.1419315

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

参考文献

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