关于TOPSIS模型需要进行以下几步处理
1. 建立原始数据矩阵
2. 进行差分处理
3. 数据正向化
4. 数据的标准化
5. 确定指标最大得分
6. 归一化处理
7. 综合评定分
收集数据后,作成一个矩阵,是114行7列,下面是MATLAB代码分析。
%clc;clear
load DATA_X %存储疫情数据
%114行 7列。
%请运行两遍脚本,第一遍按输入 1 第二遍输入 0
q=input('请输入1或0:\n 1.进行差分导入6列疫情变化数据(没有医学观察和境外输入死亡);\n 0.仅导入医学观察者: ');
if q == 1 %进行差分处理
X=X(1:114,[1 2 3 4 6 7]);
XXX(2:114,:)=X(1:113,:);
X=((X-XXX).^2).^0.5;
else
X=X(:,5);
end
[n,m] = size(X);
disp(['此次疫情数据一共有' num2str(n) '个日期对象, ' num2str(m) '属性指标'])
J = input([num2str(m) '个指标是不是要进行正向化,是就按1 ,不是则按0: ']);
if J == 1
if q == 1
X_weizhi = input('输入需要正向化处理的属性所在的列,比如第一步的第1、2、3、4、5、6六列需要正向化处理,\n那么你请输入[1,2,3,4,5,6] :');
else
X_weizhi = input('输入需要正向化处理的属性所在的列,比如第二步就1列需要正向化处理,\n那么你请输入[1] :');
end
if q==1
disp('基于第一步的,第1、2、3、4、5、6列是极小型,所以这几列需要正向化处理:')
else
disp('基于第二步,仅仅一列医学观察人数是极小型')
end
%由于此建模题的属性指标都是极小型,所以我没有处理极大型和中间型的正向化
disp('——————————分界线——————————')
for i = 1 : size(X_weizhi,2)
X(:,X_weizhi(i))=P_zxh_chuli(X(:,X_weizhi(i)),X_weizhi(i));
% X(:,P_weizhi(i)) 第一个参数是每一行 ,第二个调用P_weizhi矩阵第i的数字
% P_weizhi(i) 用于记录每次运行到哪一列
end
else
zxh = X ;
disp('矩阵没有变化 矩阵 = :')
disp(zxh);
end
zxh = X ;
disp('正向化完成的矩阵 = ')
disp(zxh)
disp('进行标准化处理')
bzh=zxh./sum(zxh.*zxh).^0.5;
disp('标准化处理完成的矩阵 = ')
disp(bzh)
disp('正在计算每个日期对象的得分 ......')
juli_max = sum((bzh - repmat(max(bzh),n,1)) .^ 2 ,2) .^ 0.5; % 与最大值的距离向量
juli_min = sum((bzh - repmat(min(bzh),n,1)) .^ 2 ,2) .^ 0.5; % 与最小值的距离向量
g = juli_min ./ (juli_max+juli_min); % 没归一化的分数
disp('每一个日期对象的得分为 :')
gyh = g / sum(g); % 进行归一化处理
disp(gyh)
if q==1
zzz=gyh;
plot(gyh)
else
plot(gyh); hold on ;plot(zzz)
end
结果如下: