Chaos is a ladder.|

West11

园龄:11个月粉丝:1关注:1

Topsis评价法

步骤:

第一步:统一指标类型

将所有的指标转化为极大型称为指标正向化(最常用).

第二步:标准化处理

为了消去不同指标量纲的影响,需要对已经正向化的矩阵进行标准化处理。

第三步找到有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。

Matlab代码

%% 区间型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
function [res] = Int2Max(X, a, b)  
   M =  max(a - min(X), max(X) - b);
   for i = 1 : size(X)
       if(X(i) < a)
           X(i) = 1 - (a - X(i))/M;
       elseif (X(i) >= a && X(i) <= b)
           X(i) = 1;
       elseif (X(i) > b)
           X(i) = 1 - (X(i) - b)/M;
       end
   end
   res = X;
end
%% 中间型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
function [res] = Mid2Max(X, best)
   M =  max(abs(X - best));
   res = 1 - abs(X - best)/M;
end
%% 极小型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
function [res] = Min2Max(X)
   res = max(X) - X;
end
%% 画图
x = rand(100,1);
y = x .* log(x);
plot(x,y);
X=xlsread()%里面加文件名
%% 正向化
disp('***************正在进行正向化...***************');
vec = input('请输入要正向化的向量组,请以数组的形式输入,如[1 2 3]表示1,2,3列需要正向化,不需要正向化请输入-1\n') %注意输入函数这里是单引号
if (vec ~= -1)
    for i = 1 : size(vec,2)
        flag = input(['第' num2str(vec(i)) '列是哪类数据(【1】:极小型 【2】:中间型 【3】:区间型),请输入序号:\n']);
        if(flag == 1)%极小型
           X(:,vec(i)) = Min2Max(X(:,vec(i)));
        elseif (flag == 2) % 注意这里的else和if是连在一起的
            best = input('请输入中间型的最好值:\n');
            temp = X(:,vec(i));
            X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
        elseif (flag == 3)
            arr = input('请输入最佳区间,按照“[a,b]”的形式输入:\n');
            X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
        end
    end
    disp('所有的数据均已完成正向化!')
end
%% 标准化
disp('***************正在进行标准化...***************');
[n,m] = size(X);
% 先检查有没有负数元素
isNeg = 0;
for i = 1 : n
    for j = 1 : m
        if(X(i,j) < 0)
            isNeg = 1;
            break;
        end
    end
end
if (isNeg == 0)
    squere_X = (X.*X);
    sum_X = sum(squere_X,1).^0.5; %按列求和,再开方
    stand_X = X./repmat(sum_X, n, 1);
else
    max_X = max(X,[],1); %按照列找出最大元素
    min_X = min(X,[],1); %按照列找出最小元素
    stand_X = X - repmat(min_X,n,1) ./ (repmat(max_X,n,1) - repmat(min_X,n,1));
end
disp('标准化完成!')
%%  (法1:用距离法打分)
disp("**********正在用距离法打分*************")
max_x = max(stand_X,[],1)%按列找最大值
min_x = min(stand_X,[],1)

(stand_X - repmat(min_x,n,1)) ./ (max_x-min_X)%repmat()拼接矩阵n行1列

%%  (法2:用优劣解打分)
disp("**************正在用优劣解打分******************")
tmp=one(m);
w_j=tmp(:,1)%默认权值为1
is_need_w=input("是否需要指定权值,需要输入1,否则输入0")
if(is_need_w==1)
    w_j = input("输入各指标权值:");
end
z_plus = repmat(max_x,n,1);
z_sub = repmat(min_x,n,1);
d_plus = sum(((stand_X-z_plus).^2) * w_j,2).^0.5;
d_sub = sum(((stand_X-z_sub).^2) * w_j,2).^0.5;
s=d_sub ./ (d_sub + d_plus)

%结果归一化
res_topsis = s ./ sum(s)

本文作者:West11

本文链接:https://www.cnblogs.com/cxy1114blog/p/18459128

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   West11  阅读(16)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起