%%动态加权评价指标 clc,clear,close all inputfile = '../MATLAB/dtjq.xlsx' ; % 销量数据文件 [num,txt,raw] = xlsread(inputfile); A=num; %% x=[0.6,0.67,0.6];%转化成标准数区间的中数 ca=[0.1,0.335,0.1];%B1值,一类水的中数 ca1=x-ca./sqrtm((-log(0.1)));%δ值 B=[0.2 0.6 1;0.67 0.67 1;0.2 0.6 1];%标准分级 a=size(A,1);% A的行数 b=size(A,2);% A的列数 MX=max(A);% A的每列的最大值 MN=min(A);% A的每列的最小值 f1=1; % B的行变量 f2=1; % B的列变量 for j=1:b % 将A里面的值标准化,a为A的行数,b为a的列数 for i=1:a A(i,j)=(A(i,j)-MN(j))/(MX(j)-MN(j)); end end X=zeros(a,4);%创建放置每一个城市天天空气质量的值矩阵 for i=1:a%计算每一个城市天天的空气质量 h=1; k=1; flag0=1;%算完每一个城市天天的空气质量后,跳到下一个城市(h=h+1) for j=1:b for flag=1:3 if A(i,j)<=ca(k) w=0; X(i,h)=X(i,h); break; elseif A(i,j)>ca(k)&&A(i,j)<B(f1,f2) w=1-exp(-(A(i,j)-ca(k)/ca1(k))^2); X(i,h)=X(i,h)+w*A(i,j);%加权 break; else k=k+1;%对应每一个中值 f2=f2+1;%对应每一个等级值 end end f1=f1+1;%对应每一个属性 k=1;%每循环完一次,跳到第一个中值 f2=1;%每循环完一次,又从第一级开始 if flag0==3%判断是否算完了一个城市天天的空气质量 h=h+1; flag0=1; f1=1; else flag0=flag0+1; end end end a=size(X,1);%X的行数 b=size(X,2);%X的列数 h=1; C=zeros(1,b);%创建整体排序矩阵 for k=1:b%将全部城市整体排序 for i=1:a for j=1:b if(A(h)>A(i,j)) C(k)= C(k)+1;%C,Borda数 else end end h=h+1; end end
二、马尔科夫链模型算法
%% 马尔科夫链 clc;clear;close all; load('example.mat') % 加载数据 %% [xrow,xcol]=size(x); for j=1:xrow for i=1:xcol-1 a(j,i)=(x(j,i+1)-x(j,i))/x(j,i); % 求增加率 end end %% 分别为不一样增加率赋值 b=zeros(xrow,xcol); for j=1 for i=1:xcol-1 if a(j,i)>=0.03 b(j,i)=2;%快速增加 elseif (a(j,i)<0.03)&&(a(j,i)>0) b(j,i)=1;%缓慢增加 elseif a(j,i)==0 b(j,i)=0; %没有增加 elseif a(j,i)>-0.03 && a(j,i)<0 b(j,i)=-1;%缓慢降低 elseif a(j,i)<-0.03 b(j,i)=-2; %快速降低 end end end %% 统计相连增加率值特征Cij c=zeros(xrow,25);%分25类 for j=1 for i=1:xcol-3 if (b(j,i)==2&&b(j,i+1)==2)%先快后也快 c(j,1)=c(j,1)+1; elseif(b(j,i)==2&&b(j,i+1)==1)%先快后缓慢快 c(j,2)=c(j,2)+1; elseif(b(j,i)==2&&b(j,i+1)==0)%先快后平缓 c(j,3)=c(j,3)+1; elseif(b(j,i)==2&&b(j,i+1)==-1) c(j,4)=c(j,4)+1; elseif(b(j,i)==2&&b(j,i+1)==-2) c(j,5)=c(j,5)+1; elseif(b(j,i)==1&&b(j,i+1)==2) c(j,6)=c(j,6)+1; elseif(b(j,i)==1&&b(j,i+1)==1) c(j,7)=c(j,7)+1; elseif(b(j,i)==1&&b(j,i+1)==0) c(j,8)=c(j,8)+1; elseif(b(j,i)==1&&b(j,i+1)==-1) c(j,9)=c(j,9)+1; elseif(b(j,i)==1&&b(j,i+1)==-2) c(j,10)=c(j,10)+1; elseif(b(j,i)==0&&b(j,i+1)==2) c(j,11)=c(j,11)+1; elseif(b(j,i)==0&&b(j,i+1)==1) c(j,12)=c(j,12)+1; elseif(b(j,i)==0&&b(j,i+1)==0) c(j,13)=c(j,13)+1; elseif(b(j,i)==0&&b(j,i+1)==-1) c(j,14)=c(j,14)+1; elseif(b(j,i)==0&&b(j,i+1)==-2) c(j,15)=c(j,15)+1; elseif(b(j,i)==-1&&b(j,i+1)==2) c(j,16)=c(j,16)+1; elseif(b(j,i)==-1&&b(j,i+1)==1) c(j,17)=c(j,17)+1; elseif(b(j,i)==-1&&b(j,i+1)==0) c(j,18)=c(j,18)+1; elseif(b(j,i)==-1&&b(j,i+1)==-1) c(j,19)=c(j,19)+1; elseif(b(j,i)==-1&&b(j,i+1)==-2) c(j,20)=c(j,20)+1; elseif(b(j,i)==-2&&b(j,i+1)==2) c(j,21)=c(j,21)+1; elseif(b(j,i)==-2&&b(j,i+1)==1) c(j,22)=c(j,22)+1; elseif(b(j,i)==-2&&b(j,i+1)==0) c(j,23)=c(j,23)+1; elseif(b(j,i)==-2&&b(j,i+1)==-1) c(j,24)=c(j,24)+1; elseif(b(j,i)==-2&&b(j,i+1)==-2) c(j,25)=c(j,25)+1; end end end %% 分类累加求和,分五类 d=zeros(xrow,5); for i=1 for j=1:25 if(j<6) d(i,1)=d(i,1)+c(i,j);%下一时刻快速增加个数 elseif(j>5&&j<11) d(i,2)=d(i,2)+c(i,j); %下一时刻缓慢增加个数 elseif(j>10&&j<16) d(i,3)=d(i,3)+c(i,j); %下一时刻稳定个数 elseif(j>15&&j<21) d(i,4)=d(i,4)+c(i,j);%下一时刻缓慢降低的个数 else d(i,5)=d(i,5)+c(i,j);%下一时刻快速降低的个数 end end end %% 一步转移几率矩阵;e值 f=b(:,37); e= zeros(5,5); for i=1 for j=1:25 if(j<6) if(d(i,1)==0) e(5,j)=0; else e(1,j)=c(i,j)/d(i,1); %一步转移几率,每五个数据与对应的Di相除 end elseif(j>5&&j<11) if(d(i,2)==0) e(5,j-5)=0; else e(2,j-5)=c(i,j)/d(i,2); end elseif(j>10&&j<16) if(d(i,3)==0) e(5,j-10)=0; else e(3,j-10)=c(i,j)/d(i,3); end elseif(j>15&&j<21) if(d(i,4)==0) e(5,j-15)=0; else e(4,j-15)=c(i,j)/d(i,4); end else if(d(i,5)==0) e(5,j-20)=0; else e(5,j-20)=c(i,j)/d(i,5); end end end % h状态几率 g=zeros(i,5); %预测四、5月的增加率 hr=[]; if(f(i,1)==2) h=[1 0 0 0 0 ]*e for k=1:6 h=h*e end elseif(f(i,1)==1) g(i,:)=[0 1 0 0 0 ]; h=g(i,:)*e for k=1:6 h=h*e end elseif(f(i,1)==0) g(i,:)=[0 0 1 0 0 ]; h=g(i,:)*e for k=1:6 h=h*e end elseif(f(i,1)==-1) g(i,:)=[0 0 0 1 0 ]; h=g(i,:)*e for k=1:6 h=h*e end elseif(f(i,1)==-2) g(i,:)=[0 0 0 0 1 ]; h=g(i,:)*e for k=1:6 h=h*e end end end
%PA 5月31:0:0 计算的MATLAB 程序以下:BP神经网络预测 %5月31位于第23行 clc,clear load('PA.mat') %原始数据以列向量的方式存放在workplace文件中 PA=PA(2:29,:); %% 数据的标准化,归一于0~1 N=size(PA);%N为PA的行列 for j=1:N(1,2)%列 PAHminmax=minmax(PA(:,j)'); for i=1:N(1,1) PA(i,j)=(PA(i,j)-PAHminmax(1,1))/(PAHminmax(1,2)-PAHminmax(1,1));%数据标准化 end end %%以天天的从0时计数起,每隔十五分钟做为输入 P=PA(2:22,:); %以5月31的间隔十五分钟的发电量做为目标向量 T=PA(23,:); %建立一个BP神经网络,每个输入向量的取值范围为[0 ,1],隐含层有22个神经元, %输出层有一个神经元,隐含层的激活函数为tansig,输出层的激活函数为%logsig, %训练函数为梯度降低函数,即标准学习算法 for i=1:21 a(i,1)=0; a(i,2)=1; end net=newff(a,[21,1],{'tansig','logsig'},'traingd'); net.trainParam.epochs=30000; net.trainParam.goal=0.01; %设置学习速率为0.1 LP.lr=0.1; %训练网络 net=train(net,P,T); %预测5月31的发电量数据 T1=sim(net,P);%预测值T1 %PA.5月31日发电量真实值 T0=PA(23,:); %预测值与实际值的偏差 for i=1:N(1,2)%PA的列 error(1,i)=T1(1,i)-T0(1,i); end %绘制偏差图 figure(1) plot(1:N(1,2),error(1,1:N(1,2)),'-*') grid on xlabel('时点x'),ylabel('发电功率偏差y'); title('PA6.1.0.0-5.31.23.45发电功率偏差图像') %绘制实时函数图 figure(2) plot(1:N(1,2),T0(1,:),1:N(1,2),T1(1,:),'r') grid on legend('实际值','预测值',2) xlabel('时点x'),ylabel('发电功率y'); title('PA6.1.0.0-5.31.23.45发电功率实时函数图像')
第17章网络
clc,clear,close all; load('x.mat'); x=x'; y=1:14; x=mapminmax(x); y=mapminmax(y); net=newff(minmax(x),[80,1],{'tansig','purelin'},'trainrp'); inputWeights=net.IW{1,1};%层权值 inputbias=net.b{2};%阀值 layerWeights=net.IW{1,1}; layerbias=net.b(2); %训练参数 net.trainParam.show=50;%训练步数 net.trainParam.lr=0.01;%学习率 net.trainParam.mc=0.9;% net.trainParam.epochs=400;% net.trainParam.goal=1e-5; [net,tr]=train(net,x,y); A_train=sim(net,x); E=y-A_train; MSE=mse(E) figure(1) plot(y,'ro--','linewidth',2) hold on plot(A_train,'bs--','linewidth',2) legend('实际值','输出值')