优劣解距离法(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的矩阵为表格构成

| 优劣解距离法(TOPSIS)+Matlab代码实现
2.了解优劣解距法(图片来源:https://www.bilibili.com/video/BV1DW411s7wi?p=4)
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现
优劣解距离法(TOPSIS)+Matlab代码实现

总结

剩余内容就不展示啦~如果还想看可以私信我,或者去https://www.bilibili.com/video/BV1DW411s7wi?p=4直接观看就好啦!
老规矩!喜欢的朋友点个赞点个关注叭~感谢支持!

上一篇:怎么判断数据是否符合某个统计学分布


下一篇:温度转换(switch)