熵权法-EWM

熵权法-EWM

背景

一种常见于数学建模的更为客观的分配权重的方法, 因为层次分析法主观性太强,专家打分实际上就是自己瞎几把打,故引入熵权法。

思路

对于一组数据指标,如果它的方差越大,就说明这个数据的相似度越小,就是它所贡献度就越大。极端来看,就如果对于某项指标来讲,他的所有的值是一样的,那么它的相似度是最大的,基于这个指标来进行判别的权重可以直接设为0。熵是不确定度的一种度量,不确定性越大,熵就越大,信息量就越大,它的对最终决策的影响权重应该就设置得更高一些。

举个清风数学建模的例子,小张和小王是两个高中生,小张学习好回回期末考满分,小王学习不好考试常常不及格。在一次考试中,小张还是考了满分,而小王也考了满分。那就很不一样了,小王这里包含的信息就非常大,所对应的权重也就高一些。

定义

  • 信息量

    定义信息量为:
    \[ I(x) = -\ln(p(x)) \]

  • 信息熵 定义信息熵为各信息量的期望值: \[ H(X) = -\sum_{i=1}^{n} p(x_i)\ln(p(x_i)) \] 当所有事件均等时,熵达到最大值:
    \[ H(X) = \ln(n) \]


计算步骤

熵权法主要包括以下三个步骤:

数据标准化

假设有个对象和个指标,原始数据构成矩阵(要先正向化):

\[ X = \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1m} \\ x_{21} & x_{22} & \cdots & x_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \cdots & x_{nm} \end{bmatrix} \]

正向化处理

  • 要求:后续计算概率时,每个元素必须为非负值。
  • 处理:如果其中存在负数,则需采用特定方法将其标准化到 [0,1] 区间。
指标名称 指标特点 例子
极大型指标(正向指标) 越大越好 成绩、利润、GDP增速
极小型指标(负向指标) 越小越好 花费、污染程度、失业率
中间型指标 越接近某个值越好 水质量评估时的PH值
区间型指标 落在某个区间最好 体温、水中某物质含量
  • 极小型转极大型:

\[ x_i = \max\{x_1, x_2, ..., x_i\} - x_i \]

注:若所有元素均为正数,可以直接取倒数。

  • 中间行转极大型:

中间型指标序列,且最佳数值为 \(x_{best}\)\(x_{new}\) 为正向化之后的极大型指标,正向化公式:

\[ M = \max\{|x_i - x_{best}|\} \]

\[ x_{new} = 1 - \frac{|x_i - x_{best}|}{M} \]

  • 区间型转极大型:

区间型指标序列,且最佳数值为 \(x_{best}\)\(x_{new}\) 为正向化之后的极大型指标,正向化公式: \[ M = \max\{a - \min\{x_i\}, \max\{x_i\} - b\} \]

\[ x_{new} = \begin{cases} 1 - \frac{a - x}{M}, & x < a \\ 1, & a \leq x \leq b \\ 1 - \frac{x - b}{M}, & x > b \end{cases} \]

标准化方法

  • 方法一(适用于无负数情况): \[ z_{ij} = \frac{x_{ij}}{\sqrt{\sum_{i=1}^{n} x_{ij}^2}} \]

  • 方法二(存在负数时): \[ z_{ij} = \frac{x_{ij} - \min\{x_{1j}, x_{2j}, \ldots, x_{nj}\}}{\max\{x_{1j}, x_{2j}, \ldots, x_{nj}\} - \min\{x_{1j}, x_{2j}, \ldots, x_{nj}\}} \]


计算概率矩阵

从标准化矩阵出发,计算各样本在每个指标下所占的比重,构成概率矩阵:

\[ p_{ij} = \frac{z_{ij}}{\sum_{i=1}^{n} z_{ij}} \] 这样确保每一列(每个指标)的概率和为1。


计算信息熵与熵权

计算信息熵

计算信息熵:

\[ e_j = -\frac{1}{\ln n} \sum_{i=1}^{n} p_{ij}\ln(p_{ij}) \quad (j=1,2,\ldots,m) \] 注意:当 \(p_{ij}=0\) 时,约定 \(\ln(0)=0\)

这里除以 \(\ln n\) 使得 \(e_j\) 被归一化到 \([0,1]\) 区间。

计算信息效用值

定义信息效用值 \(d_j\) 为: \[ d_j = 1 - e_j \] 信息效用值越大,表示该指标包含的信息越多。

归一化得熵权

最终,将各指标的信息效用值归一化,得到熵权 \(\omega_j\)\[ \omega_j = \frac{d_j}{\sum_{j=1}^{m} d_j} \quad (j=1,2,\ldots,m) \]

得分

\[ score_i = \sum_{j=1}^{m} w_{j}z_{ij} \quad (i=1,2,\ldots,n) \]

示例代码

(转自这篇帖子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
% 代码实战一下吧,如下是清风老师的课程里的例子,自己再敲了一下代码并简化了一丢丢?
clc,clear;

% 定义函数
function [lnP] = My_log(P)
% 当矩阵P中的元素为0时,返回0
n = size(P,1);
m = size(P,2);
lnP = zeros(n,m);
for i = 1:n*m
if P(i) == 0
lnP(i) = 0;
else
lnP(i) = log(P(i));
end
end
end

% 传入三个参数:
% i为第几列,type为指标类型(1:极小型, 2:中间型, 3:区间型),A_col为对应列向量
% 返回正向化后的列向量A_col
function [A_col] = Positivization(i,type,A_col)

if type == 1 % 极小型
disp(['第',num2str(i),'列是极小型'] )
A_col = min_to_max(A_col);
elseif type == 2 % 中间型
disp(['第',num2str(i),'列是中间型'] )
value = input('请输入最佳值: ');
A_col = mid_to_max(A_col, value);
elseif type == 3 % 区间型
disp(['第',num2str(i),'列是区间型'] )
l = input('请输入区间的下界: ');
r = input('请输入区间的上界: ');
A_col = inter_to_max(A_col, l, r);
else
disp('没有这种类型的指标,请检查type是否输入错误')
end
end

% 1、导入数据
load data_river.mat
% 2、正向化
[n,m] = size(A);
disp(['该数据一共有',num2str(n),'个评价对象,有',num2str(m),'个评价指标'])
jud = input(['这' num2str(m) '个指标是否需要进行正向化处理,需要请输入1 ,不需要输入0:']);
if jud == 1
col_list = input('请输入需要正向化的指标所在列组成的列表,如第2、3列,需输入[2,3]: ');
type_list = input('请输入这些列的指标类型组成的列表(1:极小型, 2:中间型, 3:区间型): ');
for i = 1:size(col_list,2) % 列
A(:,col_list(i)) = Positivization(col_list(i),type_list(i),A(:,col_list(i)));
end
end
% 3、标准化
if isempty(find(A < 0))
disp('不存在负数,标准化后的矩阵为:')
% A_stand = A./ repmat(sum(A.*A).^(1/2),n,1) % 按列求和
A_stand = (A - repmat(min(A),n,1))./(repmat(max(A)-min(A),n,1))
else
disp('存在负数,标准化后的矩阵为:')
A_stand = (A - repmat(min(A),n,1))./(repmat(max(A)-min(A),n,1))
end
% 4、计算概率矩阵:相当于每个标准化后的指标归一化
disp('概率矩阵为:')
P = A_stand./repmat(sum(A_stand),n,1)
% 5、计算每个指标的信息熵
disp('指标的信息熵:')
E = -sum(P.*My_log(P))/log(n)
% 6、计算权重
disp('指标对应的权重:')
W = (1-E)./sum(E)
% 归一化
W = W./sum(W)
% 7、计算最终得分
disp('最终综合得分为:')
score = sum(W.*A_stand,2)
score_stand = score ./ sum(score);
[score_stand_sort, index] = sort(score_stand, 'descend');
disp('最终名次为:')
disp(index)

扩展

  1. 修正TOPSIS法:可利用熵权法修正TOPSIS法,使决策更加客观。
  2. 主客观权重综合:将客观赋权(熵权法)与主观赋权相结合,可获得更合理的权重分配。
  3. 其他客观赋权方法:例如灰色关联分析法也可作为计算权重的方法。
  4. 标准化方法选择:不同的标准化方法会得到不同的 (Z) 矩阵,需根据实际情况选择合适方法。

模型总结

  • 第一步:检查输入矩阵中是否存在负数,并进行必要的标准化处理,确保数据非负。
  • 第二步:计算每个指标下每个样本的比重,构成概率矩阵。
  • 第三步:利用概率矩阵计算各指标的信息熵,然后计算信息效用值,最后归一化得到各指标的权重。


熵权法-EWM
http://example.com/2025/03/31/数学建模/评价类模型/2025-03-31-熵权法(EWM)/
作者
ZHW
发布于
2025年3月31日
许可协议