赞
踩
基于熵权法对TOPSIS模型的修正
2020.12.10
TOPSIS需要准确,还需要分别乘以各指标对应的权重,我们可以使用层次分析法来获取指标的权重,但是层次分析法太过于主观,所以这里我想介绍一下新学的方法——熵权法,来对TOPSIS进行一个权重的附加。
1.熵权法的计算步骤
①判断输入的矩阵是否存在负数,如果有则重新标准化区间
②计算第j项指标下第i个样本所占的比重,并将其看做相对熵计算中用到的概率
③计算每个指标的信息熵,并计算信息效用值,并归一化得到每个指标的熵权
2.matlab代码实现:
%基于熵权法对于TOPSIS的修正
clear;clc;
load X.mat;
%获取行数列数
r = size(X,1);
c = size(X,2);
%首先,把我们的原始指标矩阵正向化
%第二列中间型--->极大型
middle = input("请输入最佳的中间值:");
M = max(abs(X(:,2)-middle));
for i=1:r
X(i,2) = 1-abs(X(i,2)-middle)/M;
end
%第三列极小型--->极大型
max_value = max(X(:,3));
X(:,3) = abs(X(:,3)-max_value);
%第四列区间型--->极大型
a = input("请输入区间的下界:");
b = input("请输入区间的上界:");
M = max(a-min(X(:,4)),max(X(:,4))-b);
for i=1:r
if (X(i,4)<a)
X(i,4) = 1-(a-X(i,4))/M;
elseif (X(i,4)<=b&&X(i,4)>=a)
X(i,4) = 1;
else
X(i,4) = 1-(X(i,4)-b)/M;
end
end
disp("正向化后的矩阵为:");
disp(X);
%然后对正向化后的矩阵进行熵权法赋权重
tempX = X; %代替X进行计算的辅助变量,避免X受到影响而发生改变
%测试:tempX = [1,2,3;-1,0,-6;5,-3,2];
%标准化矩阵,消除负数项,并且把数值控制在0-1区间
min_value = min(tempX);
max_value = max(tempX);
min_value = repmat(min_value,size(tempX,1),1);
max_value = repmat(max_value,size(tempX,1),1);
tempX = (tempX-min_value)./(max_value-min_value);
%求出矩阵的概率矩阵,即能取到该值的概率
sumX = repmat(sum(tempX),size(tempX,1),1);
pX = tempX./sumX;
%求出信息熵矩阵,信息熵越大,能获得的信息就越少
temp = pX.*mylog(pX);
n = size(tempX,1);
sum1 = sum(temp);
eX = sum1.*(-1/log(n));
%求出信息效用值
dX = 1-eX;
%求出每个指标的熵权
weight = dX./(sum(dX));
%打印输出
disp("每个指标依次的熵权为:");
disp(weight);
%------------------------------------------------------------------------------------------------------
%继续TOPSIS的步骤:对正向化后的矩阵X进行标准化(原矩阵除以每一列元素平方之和的开方)
temp1 = X.*X; %先让每每一个元素平方
temp2 = sum(temp1); %再对每一列求和
temp3 = temp2.^0.5; %再把结果开方
temp4 = repmat(temp3,r,1); %把开方后的结果按行复制r行
disp("******标准化后的矩阵为:");
Z = X./temp4 %原矩阵除以每一列元素平方之和的开方
Z_max = max(Z) %获得Z每一列中最大的元素
Z_min = min(Z) %获得Z每一列中最小的元素
D_max = sum(weight.*(Z-repmat(Z_max,r,1)).^2,2).^0.5
D_min = sum(weight.*(Z-repmat(Z_min,r,1)).^2,2).^0.5
disp("该矩阵得分为:")
S = D_min./(D_max+D_min)
disp("矩阵归一化后得分为:");
S = S./(repmat(sum(S),r,1))
数据X为:
4.69000000000000 6.59000000000000 51 11.9400000000000
2.03000000000000 7.86000000000000 19 6.46000000000000
9.11000000000000 6.31000000000000 46 8.91000000000000
8.61000000000000 7.05000000000000 46 26.4300000000000
7.13000000000000 6.50000000000000 50 23.5700000000000
2.39000000000000 6.77000000000000 38 24.6200000000000
7.69000000000000 6.79000000000000 38 6.01000000000000
9.30000000000000 6.81000000000000 27 31.5700000000000
5.45000000000000 7.62000000000000 5 18.4600000000000
6.19000000000000 7.27000000000000 17 7.51000000000000
7.93000000000000 7.53000000000000 9 6.52000000000000
4.40000000000000 7.28000000000000 17 25.3000000000000
7.46000000000000 8.24000000000000 23 14.4200000000000
2.01000000000000 5.55000000000000 47 26.3100000000000
2.04000000000000 6.40000000000000 23 17.9100000000000
7.73000000000000 6.14000000000000 52 15.7200000000000
6.35000000000000 7.58000000000000 25 29.4600000000000
8.29000000000000 8.41000000000000 39 12.0200000000000
3.54000000000000 7.27000000000000 54 3.16000000000000
7.44000000000000 6.26000000000000 8 28.4100000000000
输出结果:
请输入最佳的中间值:7
请输入区间的下界:10
请输入区间的上界:20
正向化后的矩阵为:
4.6900 0.7172 3.0000 1.0000
2.0300 0.4069 35.0000 0.6940
9.1100 0.5241 8.0000 0.9058
8.6100 0.9655 8.0000 0.4443
7.1300 0.6552 4.0000 0.6914
2.3900 0.8414 16.0000 0.6007
7.6900 0.8552 16.0000 0.6551
9.3000 0.8690 27.0000 0
5.4500 0.5724 49.0000 1.0000
6.1900 0.8138 37.0000 0.7848
7.9300 0.6345 45.0000 0.6992
4.4000 0.8069 37.0000 0.5419
7.4600 0.1448 31.0000 1.0000
2.0100 0 7.0000 0.4546
2.0400 0.5862 31.0000 1.0000
7.7300 0.4069 2.0000 1.0000
6.3500 0.6000 29.0000 0.1824
8.2900 0.0276 15.0000 1.0000
3.5400 0.8138 0 0.4088
7.4400 0.4897 46.0000 0.2731
每个指标依次的熵权为:
0.3162 0.1805 0.3510 0.1523
******标准化后的矩阵为:
Z =
0.1622 0.2483 0.0245 0.3065
0.0702 0.1408 0.2863 0.2127
0.3150 0.1814 0.0655 0.2776
0.2977 0.3342 0.0655 0.1361
0.2466 0.2268 0.0327 0.2119
0.0826 0.2912 0.1309 0.1841
0.2659 0.2960 0.1309 0.2008
0.3216 0.3008 0.2209 0
0.1885 0.1981 0.4009 0.3065
0.2141 0.2817 0.3027 0.2405
0.2742 0.2196 0.3682 0.2143
0.1522 0.2793 0.3027 0.1661
0.2580 0.0501 0.2536 0.3065
0.0695 0 0.0573 0.1393
0.0705 0.2029 0.2536 0.3065
0.2673 0.1408 0.0164 0.3065
0.2196 0.2077 0.2373 0.0559
0.2867 0.0095 0.1227 0.3065
0.1224 0.2817 0 0.1253
0.2573 0.1695 0.3763 0.0837
Z_max =
0.3216 0.3342 0.4009 0.3065
Z_min =
0.0695 0 0 0
D_max =
0.2431
0.1808
0.2094
0.2100
0.2298
0.2151
0.1689
0.1609
0.0946
0.0906
0.0689
0.1265
0.1532
0.2932
0.1751
0.2441
0.1586
0.2158
0.2729
0.1182
D_min =
0.1684
0.1981
0.1956
0.2024
0.1625
0.1629
0.2004
0.2314
0.2868
0.2488
0.2766
0.2294
0.2204
0.0641
0.2105
0.1742
0.1875
0.1858
0.1326
0.2591
该矩阵得分为:
S =
0.4092
0.5229
0.4829
0.4908
0.4142
0.4310
0.5426
0.5899
0.7520
0.7332
0.8006
0.6445
0.5900
0.1794
0.5460
0.4165
0.5418
0.4626
0.3271
0.6867
矩阵归一化后得分为:
S =
0.0387
0.0495
0.0457
0.0465
0.0392
0.0408
0.0514
0.0558
0.0712
0.0694
0.0758
0.0610
0.0559
0.0170
0.0517
0.0394
0.0513
0.0438
0.0310
0.0650
熵权法相对于层次分析法来说,的确是一种比较客观的求权重方法,但是它也存在一些问题。例如在学校中,我们用X来表示大家被处分的次数,Y来表示大家迟到的次数,你们觉得哪一项指标的对学生的综合评定影响更大?答案很明显是X(被处分的次数),但是,总体上来看,大部分的学生被处分的次数为0,这样就意味着总体数据的方差非常接近于0,这也就意味着这一项指标的变异程度非常小,而熵权法就是以指标的变异程度来判断指标的权值大小的,所以说,如果用熵权法来对X算权重的话,我们得到的权重结果会非常小,这显然是与现实经验相违背的,这也就是熵权法存在的问题之一。
熵权法是一种客观赋权的方法,依据的原理是指标的变异程度,变异程度越小,所反映的信息就越少,其对应的权值就越低(也就是说数据本身就可以告诉我们权值)。当然,对于熵权法存在的问题,我们可以可以灵活选取方法,比如重新回到我们的层次分析法上qwq。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。