TOPSIS法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。
步骤如下:
- 先将原始数据矩阵统一指标类型得到正向化的矩阵
- 对正向化的矩阵进行标准化处理以消除各指标量纲的影响
- 找到有限方案中的最优解和最劣解,分别计算各评价对象与最优解和最劣解间的距离,获得各评价对象与最优解的相对接近程度,以此作为评价优劣的依据
第一步:将原始矩阵正向化
最常见的四种指标
指标名称 | 指标特点 | 例子 |
极大型(效益型)指标 | 越大(多)越好 | 成绩、GDP增速、企业利润 |
极小型(成本型)指标 | 越小(少)越好 | 费用、坏品率、污染程度 |
中间型指标 | 越接近某个值越好 | 水质量评估时的PH值 |
区间型指标 | 落在某个区间最好 | 体温、水中植物性营养物量 |
所谓的将原始矩阵正向化,就是要将所有的指标类型统一转化为极大型指标。
1.极小型指标 极大型指标
极小型指标转换为极大型指标的公式: max-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.中间型指标 极大型指标
是一组中间型指标序列,且最佳的数值为,那么正向化的公式如下:
绝对值:\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.区间型指标 极大型指标
是一组区间型指标序列,且最佳的区间为 ,那么正向化的公式如下:
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个评价指标(已经正向化了)构成的正向化矩阵如下:
那么,对其标准化的矩阵记为Z,Z中的每一个元素为X中每一个元素除以其所在列元素平方和的平方根。
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化后的矩阵 Z = ')
disp(Z)
第三步:计算得分并归一化
定义最大值
定义最小值
定义第i个评价对象与最大值的距离
定义第i个评价对象与最小值的距离
那么,我们可以计算得出第i个评价对象未归一化的得分
很明显 , 且 越大 越小,即越接近最大值
我们可以将得分归一化: ,这样的话
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个评价对象与最大值的距离
定义第i个评价对象与最小值的距离
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')