【数学建模】基于熵权法对TOPSIS模型的修正+Matlab代码实现

学习内容:

基于熵权法对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。

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WSKH0929

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值