TOPSIS(优劣解距离法)

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

步骤如下:

  1. 先将原始数据矩阵统一指标类型得到正向化的矩阵
  2. 对正向化的矩阵进行标准化处理以消除各指标量纲的影响
  3. 找到有限方案中的最优解和最劣解,分别计算各评价对象与最优解和最劣解间的距离,获得各评价对象与最优解的相对接近程度,以此作为评价优劣的依据

第一步:将原始矩阵正向化

最常见的四种指标

指标名称指标特点例子
极大型(效益型)指标越大(多)越好成绩、GDP增速、企业利润
极小型(成本型)指标越小(少)越好费用、坏品率、污染程度
中间型指标越接近某个值越好水质量评估时的PH值
区间型指标落在某个区间最好体温、水中植物性营养物量

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

1.极小型指标 \rightarrow 极大型指标

极小型指标转换为极大型指标的公式: max-x
如果所有的元素均为正数,那么也可以使用  \frac{1}{x} 
代码如下:
clc,clear
disp("请输入需要正向化的矩阵A")
A=input("A=")
judge=0;
[m,n]=size(A)
for i=1:m
    if(A(i)<=0)
        judge=1
    end
end
if judge==0
    B=A.^(-1)
    disp("正向化后的矩阵为B:")
    disp(B);
elseif judge==1
    disp("无法用倒数形式进行正向化,改为用max-a形式")
    B=repmat(max(A),1)-A;
    disp("正向化后的矩阵为B:")
    disp(B);
end

2.中间型指标 \rightarrow 极大型指标

 \left \{ x_{i} \right \}是一组中间型指标序列,且最佳的数值为x_{best},那么正向化的公式如下:

M=max\left \{ \lvert x_{i}-x_{best} \rvert \right \},\tilde{x_{i}}=1-\frac{\lvert x_{i}-x_{best} \rvert}{M}

绝对值:\lvert 和 \rvert

clc,clear
disp("请输入需要正向化的矩阵A=")
A=input("A=");
[m,n]=size(A);
disp("请输入中间值A_best=")
A_best=input("A_best=");
M=0;
for i=1:m
    if(abs(A(i)-A_best)>M)
        M=abs(A(i)-A_best);
    end
end
for i=1:m
    B(i)=1-abs(A(i)-A_best)/M;
end
disp("正向化后的矩阵B=")
disp(B)

3.区间型指标 \rightarrow 极大型指标

 \left \{ x_{i} \right \}是一组区间型指标序列,且最佳的区间为 \left [ a,b \right ] ,那么正向化的公式如下:

M=max\left \{ a-min\left \{ x_{i} \right \},max\left \{ x_{i} \right \}-b \right \}, \tilde{x_{i}}=\left\{\begin{matrix} 1-\frac{a-x_{i}}{M} &x_{i}<a \\ 1 & a\leq x_{i}\leq b\\ a-\frac{x_{i}-b}{M} &x_{i}> b \end{matrix}\right.

clc,clear
disp("请输入需要正向化的矩阵A=")
A=input("A=");
[m,n]=size(A);
A_min=min(A);
A_max=max(A);
disp("请输入最佳区间[a,b]=")
x=input('最佳区间(exp:[36,37])','s');
ins=str2num(x);
a=ins(1);
b=ins(2);
if((a-A_min)>(A_max-b))
    M=a-A_min;
else
    M=A_max-b;
end
for i=1:m
    if A(i)<a
        B(i)=1-(a-A(i))/M;
    elseif a<=A(i) && A(i)<=b
        B(i)=1;
    else
        B(i)=1-(A(i)-b)/M;
    end
end
disp("正向化后的矩阵B=")
disp(B)

第二步:正向化矩阵标准化

假设有n个要评价的对象,m个评价指标(已经正向化了)构成的正向化矩阵如下:

X=\begin{bmatrix} x_{11} &x_{12} &... &x_{1m} \\ x_{21} &x_{22} &... &x_{2m} \\ ... & ... & ... & ...\\ x_{n1} &x_{n2} &... &x_{nm} \end{bmatrix}

那么,对其标准化的矩阵记为Z,Z中的每一个元素为X中每一个元素除以其所在列元素平方和的平方根。

z_{ij}=x_{ij}/\sqrt{\sum_{i=1}^{n}x_{ij}^{2}}

Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化后的矩阵 Z = ')
disp(Z)

 第三步:计算得分并归一化

Z=\begin{bmatrix} z_{11} &z_{12} & ... &z_{1m} \\ z_{21} &z_{22} & ... &z_{2m} \\ ... & ... & ... & ...\\ z_{n1} & z_{n2} & ... &z_{nm} \end{bmatrix}

定义最大值 Z^{+}=\left ( Z_{1}^{+},Z_{2}^{+},...,Z_{m}^{+} \right )

                           =\left ( max\left \{ z_{11},z_{21},..,z_{n1} \right \},max\left \{ z_{12},z_{22},..,z_{n2} \right \},...,max\left \{ z_{1m},z_{2m},..,z_{nm} \right \} \right )

定义最小值 Z^{-}=\left ( Z_{1}^{-},Z_{2}^{-},...,Z_{m}^{-} \right )

                           =\left ( min\left \{ z_{11},z_{21},..,z_{n1} \right \},min\left \{ z_{12},z_{22},..,z_{n2} \right \},...,min\left \{ z_{1m},z_{2m},..,z_{nm} \right \} \right )

定义第i个评价对象与最大值的距离

D_{i}^{+}=\sqrt{\sum_{j=1}^{m}\left ( Z_{j}^{+}-z_{ij} \right )^{2}}

定义第i个评价对象与最小值的距离

D_{i}^{-}=\sqrt{\sum_{j=1}^{m}\left ( Z_{j}^{-}-z_{ij} \right )^{2}}

那么,我们可以计算得出第i个评价对象未归一化的得分

S_{i}=\frac{D_{i}^{-}}{D_{i}^{+}+D_{i}^{-}}

很明显0\leq S_{i}\leq 1 , 且 S_{i} 越大 D_{i}^{+} 越小,即越接近最大值

我们可以将得分归一化:\tilde{S_{i}}=S_{i}/\sum_{i=1}^{n}S_{i} ,这样的话 \sum_{i=1}^{n}\tilde{S_{i}}=1

D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ]).^ 0.5  % D+ 与最大值的距离向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ]).^ 0.5  % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N);    % 未归一化的得分
disp('最后的得分为:')
stand_S = S / sum(S)     % 归一化的得分
[sorted_S,index] = sort(stand_S ,'descend')

拓展:对m个评价指标赋予权重(层次分析法)

 定义第i个评价对象与最大值的距离

D_{i}^{+}=\sqrt{\sum_{j=1}^{m}\omega _{j}\left ( Z_{j}^{+}-z_{ij} \right )^{2}}

定义第i个评价对象与最小值的距离

D_{i}^{-}=\sqrt{\sum_{j=1}^{m}\omega _{j}\left ( Z_{j}^{-}-z_{ij} \right )^{2}}

D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;   % D+ 与最大值的距离向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;   % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N);    % 未归一化的得分
disp('最后的得分为:')
stand_S = S / sum(S)
[sorted_S,index] = sort(stand_S ,'descend')

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zedkyx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值