由于层次分析法的主观性太强,判断矩阵的确定依赖于专家(事实上比赛时都是靠自己的感觉来),自己的主观判断对结果的影响是很大的,故引入熵权法,更加客观的计算权重。
基于一组数据,方差越小,说明该数据的相似度越大,我们可以判断其优劣的贡献度越小。
极端的来看,某项指标,每个对象的得分相同,数据的相似度达到最大,则判断哪个对象较好是没有必要的,即说明这个指标的权重为0.
熵是对不确定性的一种度量,从某种角度来看:
不确定性越大,熵就越大,包含的信息量越大,对应的权重越高;
不确定性越小,熵就越小,包含的信息量越小,对应的权重越低。
指标名称 | 指标特点 | 例子 |
---|---|---|
极大型指标 | 越大越好 | 成绩、利润、GDP增速 |
极小型指标 | 越小越好 | 花费、污染程度、失业率 |
中间型指标 | 越接近某个值越好 | 水质量评估时的PH值 |
区间型指标 | 落在某个区间最好 | 体温、水中某物质含量 |
将所有的指标转化为极大型指标,称为指标的正向化
极小型–>极大型:
x i = m a x { x 1 , x 2 , . . . , x i } − x i x_i=max\{x_1,x_2,...,x_i\}-x_i xi=max{ x1,x2,...,xi}−xi
若所有元素均为正数,可以直接取倒数
x i = 1 x i x_i=\frac{1}{x_i} xi=xi1
中间型–>极大型:
{ x i } 是 一 组 中 间 型 指 标 序 列 , 且 最 佳 的 数 值 为 x b e s t , x n e w 为 正 向 化 之 后 的 极 大 型 指 标 , 正 向 化 公 式 如 下 : M = m a x { ∣ x i − x b e s t ∣ } x n e w = 1 − ∣ x i − x b e s t ∣ M \{x_i\}是一组中间型指标序列,且最佳的数值为x_{best},x_{new}为正向化之后的极大型指标,正向化公式如下:\\ M=max\{|x_i-x_{best}|\}\\ x_{new} = 1-\frac{|x_i-x_{best}|}{M} { xi}是一组中间型指标序列,且最佳的数值为xbest,xnew为正向化之后的极大型指标,正向化公式如下:M=max{ ∣xi−xbest∣}xnew=1−M∣xi−xbest∣
区间型–>极大型:
{ x i } 是 一 组 区 间 型 指 标 序 列 , 且 最 佳 的 数 值 为 x b e s t , x n e w 为 正 向 化 之 后 的 极 大 型 指 标 , 正 向 化 公 式 如 下 : M = m a x { a − m i n { x i } , m a x { x i } − b } x n e w = { 1 − a − x M , x < a 1 , a ≤ x ≤ b 1 − x − b M , x > b \{x_i\}是一组区间型指标序列,且最佳的数值为x_{best},x_{new}为正向化之后的极大型指标,正向化公式如下:\\ M=max\{a-min\{x_i\},\ max\{x_i\}-b\}\\ x_{new}=\begin{cases}1-\frac{a-x}{M}&,xb \end{cases} { xi}是一组区间型指标序列,且最佳的数值为xbest,xnew为正向化之后的极大型指标,正向化公式如下:M=max{ a−min{ xi}, max{ xi}−b}xnew=⎩⎪⎨⎪⎧1−Ma−x11−Mx−b,x<a,a≤x≤b,x>b
n个评价对象,m个评价指标(已正向化)
① 不存在负数的标准化
② 存在负数的标准化(事实上不存在负数时也常常使用如下公式)
z i j = x i j − m i n { x 1 j , x 2 j . . . , x i j } m a x { x 1 j , x 2 j . . . , x i j } − m i n { x 1 j , x 2 j . . . , x i j } z_{ij}=\frac{x_{ij}-min\{x_{1j},x_{2j}...,x_{ij}\}}{max\{x_{1j},x_{2j}...,x_{ij}\}-min\{x_{1j},x_{2j}...,x_{ij}\}} zij=max{ x1j,x2j...,xij}−min{ x1j,x2j...,xij}xij−min{ x1j,x2j...,xij}
计算概率矩阵p:
p i j = z i j ∑ i = 1 n z i j p_{ij}=\frac{z_{ij}}{\sum_{i=1}^{n}z_{ij}} pij=∑i=1nzijzij
e j = − 1 l n n ∑ i = 1 n p i j l n ( p i j ) , ( j = 1 , 2 , . . . , m ) e_j=-\frac{1}{lnn}\sum_{i=1}^{n}p_{ij}ln(p_{ij}),\ \ (j=1,2,...,m) ej=−lnn1i=1∑npijln(pij), (j=1,2,...,m)
其中
k = 1 l n n > 0 , e j ≥ 0 k=\frac{1}{lnn}>0\ ,\ e_j≥0 k=lnn1>0 , ej≥0
1-e为信息效用值,再进行归一化即为权重
d j = 1 − e j , ( j = 1 , 2 , . . . , m ) w j = d j ∑ j = 1 m d j , ( j = 1 , 2 , . . . , m ) d_j=1-e_j,\ \ (j=1,2,...,m)\\ w_j=\frac{d_j}{\sum_{j=1}^{m}d_j},\ \ (j=1,2,...,m) dj=1−ej, (j=1,2,...,m)wj=∑j=1mdjdj, (j=1,2,...,m)
综合得分=权重*得分
s c o r e i = ∑ j = 1 m w j z i j , ( i = 1 , 2 , . . . , n ) score_i=\sum_{j=1}^{m}{w_jz_{ij}},\ \ (i=1,2,...,n) scorei=j=1∑mwjzij, (i=1,2,...,n)
% 代码实战一下吧,如下是清风老师的课程里的例子,自己再敲了一下代码并简化了一丢丢?
clc,clear;
% 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)
My_log.m
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
Positivization.m
% 传入三个参数:
% 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
命令行窗口:
数据集为:
4.6900 6.5900 51.0000 11.9400
2.0300 7.8600 19.0000 6.4600
9.1100 6.3100 46.0000 8.9100
8.6100 7.0500 46.0000 26.4300
7.1300 6.5000 50.0000 23.5700
2.3900 6.7700 38.0000 24.6200
7.6900 6.7900 38.0000 6.0100
9.3000 6.8100 27.0000 31.5700
5.4500 7.6200 5.0000 18.4600
6.1900 7.2700 17.0000 7.5100
7.9300 7.5300 9.0000 6.5200
4.4000 7.2800 17.0000 25.3000
7.4600 8.2400 23.0000 14.4200
2.0100 5.5500 47.0000 26.3100
2.0400 6.4000 23.0000 17.9100
7.7300 6.1400 52.0000 15.7200
6.3500 7.5800 25.0000 29.4600
8.2900 8.4100 39.0000 12.0200
3.5400 7.2700 54.0000 3.1600
7.4400 6.2600 8.0000 28.4100
该数据一共有20个评价对象,有4个评价指标
这4个指标是否需要进行正向化处理,需要请输入1 ,不需要输入0:1
请输入需要正向化的指标所在列组成的列表,如第2、3列,需输入[2,3]: [2,3,4]
请输入这些列的指标类型组成的列表(1:极小型, 2:中间型, 3:区间型): [2,1,3]
第2列是中间型
请输入最佳值: 7
第3列是极小型
第4列是区间型
请输入区间的下界: 10
请输入区间的上界: 20
不存在负数,标准化后的矩阵为:
A_stand =
0.3676 0.7429 0.0612 1.0000
0.0027 0.4214 0.7143 0.6940
0.9739 0.5429 0.1633 0.9058
0.9053 1.0000 0.1633 0.4443
0.7023 0.6786 0.0816 0.6914
0.0521 0.8714 0.3265 0.6007
0.7791 0.8857 0.3265 0.6551
1.0000 0.9000 0.5510 0
0.4719 0.5929 1.0000 1.0000
0.5734 0.8429 0.7551 0.7848
0.8121 0.6571 0.9184 0.6992
0.3278 0.8357 0.7551 0.5419
0.7476 0.1500 0.6327 1.0000
0 0 0.1429 0.4546
0.0041 0.6071 0.6327 1.0000
0.7846 0.4214 0.0408 1.0000
0.5953 0.6214 0.5918 0.1824
0.8615 0.0286 0.3061 1.0000
0.2099 0.8429 0 0.4088
0.7449 0.5071 0.9388 0.2731
概率矩阵为:
P =
0.0337 0.0611 0.0067 0.0750
0.0003 0.0347 0.0785 0.0520
0.0892 0.0447 0.0179 0.0679
0.0829 0.0823 0.0179 0.0333
0.0643 0.0558 0.0090 0.0518
0.0048 0.0717 0.0359 0.0450
0.0714 0.0729 0.0359 0.0491
0.0916 0.0741 0.0605 0
0.0432 0.0488 0.1099 0.0750
0.0525 0.0694 0.0830 0.0588
0.0744 0.0541 0.1009 0.0524
0.0300 0.0688 0.0830 0.0406
0.0685 0.0123 0.0695 0.0750
0 0 0.0157 0.0341
0.0004 0.0500 0.0695 0.0750
0.0719 0.0347 0.0045 0.0750
0.0545 0.0511 0.0650 0.0137
0.0789 0.0024 0.0336 0.0750
0.0192 0.0694 0 0.0307
0.0682 0.0417 0.1031 0.0205
指标的信息熵:
E =
0.9116 0.9495 0.9019 0.9574
指标对应的权重:
W =
0.0238 0.0136 0.0264 0.0114
W =
0.3162 0.1805 0.3510 0.1523
最终综合得分为:
score =
0.4241
0.4334
0.6012
0.5917
0.4785
0.3799
0.6206
0.6720
0.7596
0.7180
0.8042
0.6021
0.6378
0.1194
0.4853
0.4908
0.5359
0.5373
0.2807
0.6982
最终名次为:
11
9
10
20
8
13
7
12
3
4
18
17
16
15
5
2
1
6
19
14