步骤:
第一步:统一指标类型
将所有的指标转化为极大型称为指标正向化(最常用).
第二步:标准化处理
为了消去不同指标量纲的影响,需要对已经正向化的矩阵进行标准化处理。
第三步,找到有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。
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)
标签:end,Topsis,min,%%,max,vec,评价,正向
From: https://www.cnblogs.com/cxy1114blog/p/18459128