优劣解距离法(TOPSIS)+Matlab代码实现
作者:互联网
学习内容:
1、 了解优劣解距法
2、 matlab代码实现TOPSIS
学习时间:
2020.12.07
学习内容
1.这次先亮代码
%*******************************************************************************************
clear;clc;
%第一步:读取存储好的变量,里面存放的是数据矩阵
load X.mat;
%第二步:判断是否需要正向化
[r,c] = size(X); %获取数据矩阵X的行数r和列数c
disp("数据矩阵中共有 "+c+" 个评价指标, "+r+" 个评价对象");
judge = input("这"+c+"个评价指标是否需要经过正向化处理,需要请输入1,不需要请输入0:");
disp("--------------------------------------------------------------------------------------");
if judge == 1
disp("请输入需要正向化处理的指标所在列,例如第2,3,6列需要处理,那么你需要输入[2,3,6]");
position = input("请输入:");
disp("--------------------------------------------------------------------------------------")
disp("请输入你要处理的这些列的指标类型(1.极小型 2.中间型 3.区间型)");
disp("例如,第1列要转换为中间型,第二列转换为区间型,第三列转换为极小型,那么你需要输入:[2,3,1]");
type = input("请输入:");
disp("--------------------------------------------------------------------------------------");
for i=1:size(position,2)
X(:,position(i)) = PositiveChange(X(:,position(i)),type(i),position(i));
end
disp("正向化后的矩阵:");
disp(X);
end
%第三步:对正向化后的矩阵进行标准化(原矩阵除以每一列元素平方之和的开方)
temp1 = X.*X; %先让每每一个元素平方
temp2 = sum(temp1); %再对每一列求和
temp3 = temp2.^0.5; %再把结果开方
temp4 = repmat(temp3,r,1); %把开方后的结果按行复制r行
Z = X./temp4; %原矩阵除以每一列元素平方之和的开方
disp("******标准化后的矩阵为:");
disp(Z);
%第四步:计算最大值和最小值之间的距离,并算出得分
Z_max = max(Z) %获得Z每一列中最大的元素
Z_min = min(Z) %获得Z每一列中最小的元素
D_max = sum((Z-repmat(Z_max,r,1)).^2,2).^0.5
D_min = sum((Z-repmat(Z_min,r,1)).^2,2).^0.5
disp("******未归一化的得分:")
S = D_min./(D_max+D_min) %未归一化的得分
disp("******归一化后的得分:");
standard_S = S./sum(S)
disp("******降序排列后的得分:");
%降序排列得分,不加参数descend就是升序排列,sort_stand_S代表排序后的矩阵,index代表对应元素的索引
[sort_stand_S,index] = sort(standard_S,'descend');
disp(sort_stand_S);
disp(index);
%-------------------------------------------------------------------------------------------------
%用于把指标正向化的函数
%X_positive是返回的值,X是传入的矩阵,tpye传入的指标类型,i代表X中的第几列
function [X_positive] = PositiveChange(X,type,i)
if type==1 %极小型
X_positive = max(X)-X;
disp("第"+i+"列极小型正向化处理完毕:");
disp(X_positive);
disp("--------------------------------------------------------------------------------------");
elseif type==2 %中间型
best = input("请输入best值:");
M = max(abs(X-best));
X_positive = 1-abs(X-best)/M;
disp("第"+i+"列中间型正向化处理完毕:");
disp(X_positive);
disp("--------------------------------------------------------------------------------------");
elseif type==3 %区间型
a = input("请输入区间的最小边界值:");
b = input("请输入区间的最大边界值:");
r = size(X,1); %row
M = max(a-min(X),max(X)-b);
X_positive = zeros(r,1); %初始化X_positive全为0
for j=1:r
if X(j)<a
X_positive(j) = 1-(a-X(j))/M;
elseif X(j)>b
X_positive(j) = 1-(X(j)-b)/M;
else
X_positive(j) = 1;
end
end
disp("第"+i+"列区间型正向化处理完毕:");
disp(X_positive);
disp("--------------------------------------------------------------------------------------");
else
disp("没有这种类型的指标,请检查Type向量中是否有除了1,2,3之外的值");
disp("--------------------------------------------------------------------------------------");
end
end
%-------------------------------------------------------------------------------------------------
代码运行结果
数据矩阵中共有 4 个评价指标, 20 个评价对象
这4个评价指标是否需要经过正向化处理,需要请输入1,不需要请输入0:1
--------------------------------------------------------------------------------------
请输入需要正向化处理的指标所在列,例如第2,3,6列需要处理,那么你需要输入[2,3,6]
请输入:[2,3,4]
--------------------------------------------------------------------------------------
请输入你要处理的这些列的指标类型(1.极小型 2.中间型 3.区间型)
例如,第1列要转换为中间型,第二列转换为区间型,第三列转换为极小型,那么你需要输入:[2,3,1]
请输入:[2,1,3]
--------------------------------------------------------------------------------------
请输入best值:7
第2列中间型正向化处理完毕:
0.7172
0.4069
0.5241
0.9655
0.6552
0.8414
0.8552
0.8690
0.5724
0.8138
0.6345
0.8069
0.1448
0
0.5862
0.4069
0.6000
0.0276
0.8138
0.4897
--------------------------------------------------------------------------------------
第3列极小型正向化处理完毕:
3
35
8
8
4
16
16
27
49
37
45
37
31
7
31
2
29
15
0
46
--------------------------------------------------------------------------------------
请输入区间的最小边界值:10
请输入区间的最大边界值:20
第4列区间型正向化处理完毕:
1.0000
0.6940
0.9058
0.4443
0.6914
0.6007
0.6551
0
1.0000
0.7848
0.6992
0.5419
1.0000
0.4546
1.0000
1.0000
0.1824
1.0000
0.4088
0.2731
--------------------------------------------------------------------------------------
正向化后的矩阵:
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.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.4177
0.3500
0.3698
0.3770
0.4021
0.3832
0.2977
0.3570
0.1904
0.1683
0.1579
0.2471
0.3262
0.5668
0.3193
0.4338
0.3405
0.4289
0.4858
0.2855
D_min =
0.4059
0.3835
0.4178
0.4320
0.3588
0.3688
0.4285
0.4503
0.5550
0.4997
0.5212
0.4517
0.4430
0.1506
0.4466
0.3913
0.3537
0.3953
0.3128
0.4611
******未归一化的得分:
S =
0.4929
0.5228
0.5305
0.5340
0.4716
0.4904
0.5901
0.5578
0.7446
0.7481
0.7674
0.6464
0.5759
0.2100
0.5831
0.4743
0.5094
0.4796
0.3917
0.6176
******归一化后的得分:
standard_S =
0.0451
0.0478
0.0485
0.0488
0.0431
0.0448
0.0539
0.0510
0.0681
0.0684
0.0702
0.0591
0.0527
0.0192
0.0533
0.0434
0.0466
0.0438
0.0358
0.0565
******降序排列后的得分:
0.0702
0.0684
0.0681
0.0591
0.0565
0.0539
0.0533
0.0527
0.0510
0.0488
0.0485
0.0478
0.0466
0.0451
0.0448
0.0438
0.0434
0.0431
0.0358
0.0192
11
10
9
12
20
7
15
13
8
4
3
2
17
1
6
18
16
5
19
14
%---------------------------------------------------------------------------
其中X的矩阵为表格构成
|
2.了解优劣解距法(图片来源:https://www.bilibili.com/video/BV1DW411s7wi?p=4)
总结
剩余内容就不展示啦~如果还想看可以私信我,或者去https://www.bilibili.com/video/BV1DW411s7wi?p=4直接观看就好啦!
老规矩!喜欢的朋友点个赞点个关注叭~感谢支持!
标签:disp,max,TOPSIS,优劣,1.0000,Matlab,positive,-------------------------------------- 来源: https://blog.csdn.net/weixin_51545953/article/details/110831401