数模笔记——二、优劣解距离法(TOPSIS)

二、优劣解距离法(TOPSIS)

(一)适用问题

一种常用的综合评价方法,能充分利用原始数据的信息,精确地反映各评价方案之间的差距

若评价的准则层太多,或准则层中的指标(相对权重已知),则不能用层次分析法评价,要用优劣解距离法

(二)模型建立

1.将原始矩阵正向化

将原始矩阵正向化就是将所有指标类型统一转化为极大型指标

(1)常见的四种指标
指标名称指标特点例子
极大型指标越大越好成绩、GDP增速、企业利润
极小型指标越小越好费用、坏品率、污染程度
中间型指标越接近某个值越好水质量评估时的PH值
区间型指标落在某个区间越好体温、水中植物性营养物量
(2)指标转化的公式
指标名称公式备注
极小型指标 x i ~ = m a x − x i \widetilde{x_i}=max-x_i xi =maxxi { x i } \lbrace{x_i}\rbrace {xi}为一组极小型指标序列, m a x max max为其中的最大值
中间型指标$M=max\lbracex_i-x_{best}
区间型指标 M = m a x { a − m i n { x i } , m a x { x i } − b } M=max\lbrace{a}-min{\lbrace{x_i}\rbrace},max{\lbrace{x_i}\rbrace}-b\rbrace M=max{amin{xi},max{xi}b} x i ~ = { 1 − a − x i M x i < a 1 a ≤ x i ≤ b 1 − x i − b M x i > b \widetilde{x_i}=\begin{cases}1-\frac{a-x_i}{M}&x_i<a\\1&a\leq{x_i}\leq{b}\\1-\frac{x_i-b}{M}&{x_i}>b\end{cases} xi =1Maxi11Mxibxi<aaxibxi>b​​ { x i } \lbrace{x_i}\rbrace {xi}为一组中间型指标序列, [ a , b ] [a,b] [a,b]为最佳的区间
2.正向化矩阵标准化

设n个要评价的对象,m个评价指标正向化后的矩阵记为X
X = [ x 11 x 12 ⋯ x 1 m x 21 x 22 ⋯ x 2 m ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x n m ] X=\begin{bmatrix} {x_{11}}&{x_{12}}&{\cdots}&{x_{1m}}\\ {x_{21}}&{x_{22}}&{\cdots}&{x_{2m}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {x_{n1}}&{x_{n2}}&{\cdots}&{x_{nm}}\\ \end{bmatrix} X=x11x21xn1x12x22xn2x1mx2mxnm
设其标准化的矩阵记为Z

Z 中 的 每 一 个 元 素 = X 中 的 每 一 个 元 素 其 所 在 列 的 元 素 的 平 方 和 Z中的每一个元素=\frac{X中的每一个元素}{\sqrt{其所在列的元素的平方和}} Z= X

z i j = x i j ∑ i = 1 n x i j 2 z_{ij}=\frac{x_{ij}}{\sqrt{\sum^n_{i=1}}{x_{ij}^2}} zij=i=1n xij2xij

3.计算得分并归一化

这n个要评价的对象,m个评价指标正向化后的矩阵记为Z
Z = [ z 11 z 12 ⋯ z 1 m z 21 z 22 ⋯ z 2 m ⋮ ⋮ ⋱ ⋮ z n 1 z n 2 ⋯ z n m ] Z=\begin{bmatrix} {z_{11}}&{z_{12}}&{\cdots}&{z_{1m}}\\ {z_{21}}&{z_{22}}&{\cdots}&{z_{2m}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {z_{n1}}&{z_{n2}}&{\cdots}&{z_{nm}}\\ \end{bmatrix} Z=z11z21zn1z12z22zn2z1mz2mznm
( i = 1 , 2 , . . . , n ) ( j = 1 , 2 , . . . , m ) (i=1,2,...,n)(j=1,2,...,m) (i=1,2,...,n)(j=1,2,...,m)

Z j + {Z^{+}_j} Zj+为第j列的最大值​​

Z j − {Z^{-}_j} Zj​​为第j列的最小值​​

设第i个评价对象与最大值的距离为 D i + D^{+}_{i} Di+
D i + = ∑ j = 1 m ( Z j + − z i j ) 2 D^{+}_{i}=\sqrt{\sum^{m}_{j=1}(Z^{+}_j-z_{ij})^2} Di+=j=1m(Zj+zij)2
设第i个评价对象与最小值的距离为 D i − D^{-}_{i} Di​​
D i − = ∑ j = 1 m ( Z j − − z i j ) 2 D^{-}_{i}=\sqrt{\sum^{m}_{j=1}(Z^{-}_j-z_{ij})^2} Di=j=1m(Zjzij)2
设第i个评价对象未归一化的得分为 S i S_i Si
S i = D i − D i + + D i − S_i=\frac{D^{-}_i}{D^{+}_{i}+D^{-}_{i}} Si=Di++DiDi
设归一化的结果为 S i ~ \widetilde{S_i} Si
S i ~ = S i ∑ i = 1 n S i \widetilde{S_i}=\frac{S_i}{\sum^{n}_{i=1}S_{i}} Si =i=1nSiSi
若这i个指标有权重


D i + = ω i ∑ j = 1 m ( Z j + − z i j ) 2 D^{+}_{i}=\sqrt{\omega_i\sum^{m}_{j=1}(Z^{+}_j-z_{ij})^2} Di+=ωij=1m(Zj+zij)2

D i − = ω i ∑ j = 1 m ( Z j − − z i j ) 2 D^{-}_{i}=\sqrt{\omega_i\sum^{m}_{j=1}(Z^{-}_j-z_{ij})^2} Di=ωij=1m(Zjzij)2

其他公式不变

(三)Matlab代码

%%复制数据到工作区方便使用
%%在工作区右键新建一个表格并重命名为X,在Excel表中复制数据,双击打开X将数据粘贴进去,关闭后将其另存为mat文件,代码和数据要在同一个目录,且Matlab的当前文件夹也是这个目录
load data.mat %data为将X另存为时的mat文件名

%%原始矩阵正向化
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象,' num2str(m) '个评价指标'])
jude = input(['这' num2str(m) '个评价指标是否需要正向化处理,需要输入1,否则输入0:']);
if jude == 1
    position = input('请输入需要正向化的评价指标的列数(若1,2,3列要处理,则输入[1,2,3]):');
    type = input('请按顺序输入这些需要正向化的指标的类型(1为极小型,2为中间型,3为区间型,若类型依次为极小型,中间型,区间型,则输入[1,2,3]):');
    for i = 1:size(position,2) %size(position,2)获得position矩阵的列数,用来控制执行正向化函数的次数
        X(:, position(i)) = Positivization(X(:, position(i)), type(i), position(i)); %position(i)表示第i列需要正向化的指标所在的列数,type(i)表示需要正向化的指标的类型,等号右边的X(:,position(i))表示第i列需要正向化的指标对应的所有对象,等号左边的X(:,position(i))表示第i列正向化之后的指标对应的所有对象,positivization是我们定义的用于正向化的函数,自定义函数要放进另一个m文件中,不可直接写在主函数中
    end
    disp('正向化后的矩阵X =')
    disp(X)
end

%%正向矩阵标准化
Z = X ./ repmat(sum(X .* X) .^ 0.5, n, 1); %sum(X.*X)表示将X中的每个元素平方后按列求和,repmat(sum(X.*X)^0.5,n,1)表示将按列求和得到的行向量复制n行成一个n*m的矩阵
disp('标准化后的矩阵Z =')
disp(Z)

%%计算与最大值与最小值之间的距离,并计算得分
Z_P = max(Z); %得到每一列的最大值,得到一个行向量
Z_N = min(Z); %得到每一列的最小值,得到一个行向量
D_P = sum((repmat(Z_P, n, 1) - Z) .^ 2,2) .^ 0.5; %sum(...,2)表示按行求和
D_N = sum((repmat(Z_N, n, 1) - Z) .^2,2) .^ 0.5;
S = D_N ./ (D_P + D_N); %得到一个列向量
disp('最终的得分为:')
stand_S = S / sum(S) %归一化
[stort_S, index] = sort(stand_S, 'descend') %sort(stand_S)表示升序排列,sort(stand_S,'descend')表示降序排列,前面的sort_S为排列后的向量,index为其对应的索引

自定义函数

%%自定义函数Positivization
function[posit_x] = Positivization(x,type,i)%输入三个参数:x为需要正向化的指标对应的所有对象,type为需要正向化的指标的类型,i为需要正向化的指标对应的列数,输出一个参数,为正向化之后的指标对应的所有对象
    if type==1
        disp(['第' num2str(i) '列指标是极小型'])
        posit_x=Min_Positivization(x);
        disp(['第' num2str(i) '列指标正向化完成'])
        disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
    elseif type==2
        disp(['第' num2str(i) '列指标是中间型'])
        best=input('请输入最佳数值:');
        posit_x=Mid_Positivization(x,best);
        disp(['第' num2str(i) '列指标正向化完成'])
        disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
    elseif type==3
        disp(['第' num2str(i) '列指标是区间型'])
        a=input('请输入最佳区间的下界:');
        b=input('请输入最佳区间的上界:');
        posit_x=Inter_Positivization(x,a,b);
        disp(['第' num2str(i) '列指标正向化完成'])
        disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
    else
        disp('没有这种类型的指标')
    end
end
%%自定义函数Min_Positivization
function[posit_x] = Min_Positivization(x) %传入一个参数x
    posit_x = max(x)-x;
end
%%自定义函数Mid_Positivization
function[posit_x] = Mid_Positivization(x, best) %传入两个参数,x和best
    M = max(abs(x - best));
    posit_x = 1 - abs(x - best) / M;
end
%%自定义函数Inter_Positivization
function[posit_x] = Inter_Positivization(x,a,b) %传入三个参数,x,a,b
    n = size(x,1); %求x的行数,即对象个数n
    M = max(a - min(x),max(x) - b);
    posit_x = zeros(n, 1); %将posit_x矩阵该列的所有对象初始化为0zeros(n)形成一个全为0的n*n矩阵,zeros(n,1)形成一个全为0的n*m矩阵,ones(n)形成一个n*n的单位阵,ones(n,m)形成一个n*m的单位阵
    for i = 1:n
        if x(i) < a
            posit_x(i) = 1 - (a - x(i)) / M;
        elseif x(i) > b
            posit_x(i) = 1 - (x(i) - b) / M;
        else
            posit_x(i) = 1;
        end
    end        

(四)例题分析

题目:请评价下表中20条河流的水质情况

(含氧量越高越好,PH值越接近7越好,细菌总数越少越好,植物性营养物量介于10~20之间最好)

在这里插入图片描述

运行代码,依次按指示输入对应的数据:1,[2,3,4],[2,1,3],7,10,20

得到正向化后的矩阵X =
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

标准化后的矩阵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

最终的得分为:

stand_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

将成绩从大到小排序stort_S =
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

各成绩对应的评价对象序号为index =
11
10
9
12
20
7
15
13
8
4
3
2
17
1
6
18
16
5
19
14

由此,我们可以推出水质最好的是第11个评价对象,即河流K

水质最差的是第14个评价对象,即河流N

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值