%%运行部分
clear;clc
%第一步导入数据
load data_water_quality.mat%%首先要自己导入并且命名数据
%% 第二步,对数据进行正向化判断
[n,m] = size(X);%获得数据的行数和列数
disp(['一共有' num2str(n) '个评价的对象, ' num2str(m) '个评价的指标']) %%num2str(n)将数值字符化
juDge= input(['这' num2str(m) '个评价指标是否需要进行正向化处理,如果需要请输入1 ,不需要输入0: ']);
if juDge== 1
poSiTion = input('请输入需要正向化处理的评价指标所在的列的位置,例如第1、5、6三列需要处理,那么你需要输入[1,5,6]: ');
disp('请输入列需要进行处理的指标类型(1:极小型, 2:中间型, 3:区间型) ')
Type = input('例如:第1列是极小型,第5列是区间型,第6列是中间型,就输入[1,3,2]: ')
% %注意,poSiTion和Type维度度相同,且均是行向量
for i = 1 : size(poSiTion,2) %了解循环的次数,即对列处理的次数
X(:,poSiTion(i)) = Positivization(X(:,poSiTion(i)),Type(i),poSiTion(i));
% Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数
end
disp('正向化后的矩阵 X = ')%%输出正向化后的矩阵,第二步完成
disp(X)
end
%% %第三步:进行标准化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);%%重复块
disp('标准化后的矩阵 Z = ')
disp(Z)%输出标准化后的矩阵。
%% 第四步:分别计算出与最大值的距离和最小值的距离,并且算出最后的得分
Djia = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5; %计算 D+
Djian= sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5; % 计算 D-
S = Djian./ (Djia+Djian); % 求得未归一化的得分
disp('最后的得分为:')%%接下来输出最后的得分
stand_S = S / sum(S)%%归一化后的得分
[sorted_S,index] = sort(stand_S ,'descend')
函数编写
函数1
%%极小型指标正向化函数
function [posit_x] = Min2Max(x)
posit_x = max(x) - x;
%posit_x = 1 ./ x; %如果x全部都大于0,也可以这样正向化
end
函数2
%%中间型指标正向化函数
function [posit_x] = Mid2Max(x,best)
M = max(abs(x-best));
posit_x = 1 - abs(x-best) / M;
end
函数3
%%区间型指标正向化函数
function [posit_x] = Inter2Max(x,a,b)
r_x = size(x,1); % row of x
M = max([a-min(x),max(x)-b]);
posit_x = zeros(r_x,1); %zeros函数用法: zeros(3) zeros(3,1) ones(3)
% 初始化posit_x全为0 初始化的目的是节省处理时间
for i = 1: r_x
if x(i) < a
posit_x(i) = 1-(a-x(i))/M;
elseif x(i) > b
posit_x(i) = 1-(x(i)-b)/M;
else
posit_x(i) = 1;
end
end
end
%%正向化集合处理函数
function [posit_x] = Positivization(x,type,i)
% 要输入三个变量:
% x:需要正向化处理的评价指标所对应的原始列向量
% type: 指标的三种类型(1:"极小型", 2:"中间型", 3:"区间型")
% i: 正在处理中的原始矩阵中的列
% 输出的变量posit_x表示:正向化后的列向量。
if type == 1 %判断是否为极小型的指标
disp(['第' num2str(i) '列是极小型指标,正在进行正向化'] )
posit_x = Min2Max(x); %调用“Min2Max函数”来进行正向化。
disp(['第' num2str(i) '列极小型正向化已经处理完成'] )
disp('~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~')%%极小型处理完成
elseif type == 2 %判断是否为中间型的指标
disp(['第' num2str(i) '列是中间型的指标'] )
best = input('请输入最佳的一个值: ');%输入一个最好的值
posit_x = Mid2Max(x,best);%%调用Mid2Max函数
disp(['第' num2str(i) '列中间型指标正向化处理已完成'] )
disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
elseif type == 3 %判断是否为区间型的指标
disp(['第' num2str(i) '列是区间型指标'] )%矩阵拼接
a = input('请输入区间的最左: ');
b = input('请输入区间的最右: ');
posit_x = Inter2Max(x,a,b);
disp(['第' num2str(i) '列区间型正向化处理已完毕'] )
disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
else
disp('没有这检测到这种类型的评价指标,请检查Type向量中是否其他值')
end
end
topsis代码matlab可直接用
最新推荐文章于 2024-07-13 14:08:07 发布