评价类模型(二)TOPSIS法(优劣解距离法)

1、极大型指标(效益型指标):越大(多)越好。  eg:成绩、GDP增速、企业利润

      极小型指标(成本型指标):越小(少)越好。  eg:费用、坏品率、污染程度

      中间型指标:越接近某个值越好。                        eg:水质量评估时的PH值

      区间型指标:落在某个区间最好。                        eg:体温、水中植物性营养物量


步骤

1、原始矩阵正向化(即将所有类型的指标都转化为极大型)

(1)极小型指标  to  极大型指标

公式:max-x   (如果所有的元素均为正数,那么也可以使用倒数1/x)

(2)中间型指标  to  极大型指标

公式:

 (最佳数值为x_{best}

(3)区间型指标  to  极大型指标

公式:

 (最佳区间为[a,b])

2、正向化矩阵标准化(标准化的目的是消除不同指标量纲的影响)

 (x_{ij}是正向化矩阵中的元素,z_{ij}是标准化矩阵中的元素)

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值