1、极大型指标(效益型指标):越大(多)越好。 eg:成绩、GDP增速、企业利润
极小型指标(成本型指标):越小(少)越好。 eg:费用、坏品率、污染程度
中间型指标:越接近某个值越好。 eg:水质量评估时的PH值
区间型指标:落在某个区间最好。 eg:体温、水中植物性营养物量
步骤
1、原始矩阵正向化(即将所有类型的指标都转化为极大型)
(1)极小型指标 to 极大型指标
公式:max-x (如果所有的元素均为正数,那么也可以使用倒数1/x)
(2)中间型指标 to 极大型指标
公式:
(最佳数值为)
(3)区间型指标 to 极大型指标
公式:
(最佳区间为[a,b])
2、正向化矩阵标准化(标准化的目的是消除不同指标量纲的影响)
(是正向化矩阵中的元素,是标准化矩阵中的元素)
3、计算得分
4、将得分归一化处理
拓展
考虑指标权重不同:(即带权重的TOPSIS)
注意:层次分析法和带权重的TOPSIS法都要使用熵权法来进行客观赋值!!!!(详情见之后的笔记)
简单例题
step 1:指标正向化
step 2:标准化处理
step 3:计算得分并归一化处理
代码(以综合熵权法)
%% 从excel中导入数据
% 复制excel中数据,在matlab工作区右键新建命名,再点开粘贴右键另存为xxx.mat格式,导入时使用load xxx.mat即可
clear;clc
load xxx.mat % 要替换,注意代码和数据要放在同一个文件夹中
%% 指标正向化
% 首先判断分别是什么类型的指标,然后提取出数据调用函数(Min,Mid,Inter)
X=[zxh1;zxh2;zxh3]%根据具体情况进行调整,输出正向化后的矩阵
%% 正向化矩阵标准化
[n,m]=size(X);%n个评价对象,m个评价指标
Z=X./repmat(sum(X.*X).^0.5,n,1)%标准化后的矩阵
%% 熵权法计算权重(如果需要就用,不需要就跳过)
P=sum(Z<0)
if sum(P)>0%若标准化后的矩阵Z中仍然存在负数,则再次标准化
for i=1:n
for j=1:m
Zz(i,j)=[X(i,j)-min(X(:,j))]/[max(X(:,j))-min(X(:,j))]%再次标准化后的矩阵
end
end
else
[h,l]=size(Zz);%正标准化矩阵的行数和列数
Dd=zeros(1,l);%信息效用值
for i=1:l
z=Zz(:,i);
p=z/sum(z)%概率矩阵,有可能为零
e=-sum(p.*logp0(p))/log(n);%信息熵,logp0是自定义函数
Dd(i)=1-e;%未归一化的信息效用值
end
W=Dd./sum(Dd)%归一化后的信息效用值,即每个指标的熵权
end
%% 计算得分并归一化
D=sum([(repmat(max(Z),n,1)-Z).^2].*repmat(W,n,1),2).^0.5;%评价对象与最大值的距离
d=sum([(repmat(min(Z),n,1)-Z).^2].*repmat(W,n,1),2).^0.5;%评价对象与最小值的距离
%W是权重,根据情况,如果不需要就删掉 .*repmat(W,n,1)
s=d./(D+d);%计算出的得分
S=s/sum(s)%归一化后的得分
[SS,index]=sort(S,'descend')%降序排列和索引
function [zxh1]=Min(x)
%极小型指标正向化
zxh1=max(x)-x;%如果x全为正数,也可以使用倒数正向化
end
function [zxh2]=Mid(x,best)
%中间型指标正向化
H=max(abs(x-best));%选出与最佳值的最远距离
zxh2=1-abs(x-best)/H;
end
function [zxh3]=Inter(x,s,S)
%区间型指标正向化
h=size(x,1);%行数
H=max([s-min(x),max(x)-S]);%s是最佳区间的下界,S是最佳区间的上界[s,S]
zxh3=zeros(h,1);%一列全为0
for i=1:h
if x(i)<s
zxh3(i)=1-(s-x(i))/H;
elseif x(i)>S
zxh3(i)=1-(x(i)-S)/H;
else
zxh3(i)=1;
end
end
end
function [logp]=logp0(p)
%log函数的补充,当p=0时,返回0
L=length(p);%长度
logp=zeros(L,1);%L行1列0
for i=1:L
if p(i)==0
logp(i)=0;
else
logp(i)=log(p(i));
end
end
end