⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lmbptraffic2.m

📁 BP神经网络预测
💻 M
字号:

                               %这是****货运量****的神经网络公式计算程序

clear
clf reset;
figure(gcf);
%setfsize(500,200);
echo on
clc
%初始数据及进行归一化处理——————————————————————————————————
                         %初始数据是两个,分别是客运量和货运量
clc
primary=[12815       15543       19326       22864       26150       28468 ...
         30882       39375       45759       49589       52560       48726 ...
         51083       56495       62767       83606       92090      101370 ...
        107317      108654      111847      112872      116997      126007      128980;
          2690        2998        3012        3042        3616        3728 ...
          3988        9397       17680       19426       24128       24354 ...
         22879       24162       28957       36439       40593       45052 ...
         47400       45224       45338       45815       47151       55705       63532]'; 
         %矩阵转置,第一列是客运量,第二列是货运量。
   %归一化
    maxium=max(primary);%求出两列的最大值,客运量最大值:maxium(1),货运量最大值:maxium(2).
    minium=min(primary);%求出两列的最小值,客运量最小值: minium(1),货运量最小值:minium(2).
    p1=0.7*(primary(:,1)-minium(1))./(maxium(1)-minium(1))+0.2;%代表归一化后的客运量列向量
    p2=0.7*(primary(:,2)-minium(2))./(maxium(2)-minium(2))+0.2;%代表归一化后的货运量列向量
    %归一化,将来计算仿真值的原值,需用上面的公式!!!!!
    
second=[p1';
        p2'];%将向量又转置,第一行p1'代表客运量的归一化后的向量,第二行p2'代表货运量的归一化后的向量。
    
 %初始数据及进行归一化处理结束!———————————————————————————————
 
 %开始划分数据,分为训练集和检验集——————————————————————————————
                     %总样本量N=25,取序列长度n=5,滚动间隔为n0=2。
                                                               
                     % 货运量———————————本程序只划分货运量数据集———————————————
                     for i=1:10
                        y1(i)=p2(2*i); 
                        y2(i)=p2(2*i+1);
                        y3(i)=p2(2*i+2);
                        y4(i)=p2(2*i+3);
                        y5(i)=p2(2*i+4);%y1等是时间序列行向量。
                        t(i)=p2(2*i+5);
                        %上为训练集,下为测试集——————————————
                        cs1(i)=p2(2*i-1); 
                        cs2(i)=p2(2*i);
                        cs3(i)=p2(2*i+1);
                        cs4(i)=p2(2*i+2);
                        cs5(i)=p2(2*i+3);%cs1等是测试集时间序列行向量。
                        tcs(i)=p2(2*i+4);
                        
                     end
                     y=[y1;
                        y2;
                        y3;
                        y4;
                        y5];%y是货运量的矩阵,y1,y2,y3,y4,y5为5次输入,8个样本。    
                     p=y;
                     t=t;%目标输出
                     
                     cs=[cs1;
                         cs2;
                         cs3;
                         cs4;
                         cs5]; %cs等是测试集。 
                      
                      
                      %预测2003年和2004年的货运量——————————————
                      p2003=[p2(21);
                             p2(22);
                             p2(23);
                             p2(24);
                             p2(25)];
                        
                      p2004=[p2(22);
                             p2(23);
                             p2(24);
                             p2(25)];

                     
                     
                     

  %数据划分结束,分为训练集和检验集,训练集是p,t.—————————————————————
  %5个输入,样本为10个。
  %输出为1个向量,样本为10个
%pause
clc
plot(t,'+');
title('Training Vectors');
xlabel('Input Vector P');
ylabel('Target Vector T');
%确定输入个数、隐含层神经元、输出层神经元数目————————————————————————
clc
r=5;          %输入个数
s1=8;         %第一层神经元数
s2=5;         %第二层神经元数
s3=1;         %第三层神经元数
%确定各个层的权重和阀值———————————————————————————————————
[w1,b1,w2,b2,w3,b3]=initff(p,s1,'tansig',s2,'tansig',t,'purelin');
echo off

%k=pickic;
k=2;
if k==2
   w1=rands(s1,r);
   b1=rands(s1,1);
   w2=rands(s2,s1);
   b2=rands(s2,1);
   w3=rands(s3,s2);
   b3=rands(s3,1);
end
echo on
clc
%确定显示频率、最大步数、学习率———————————————————————————————
df=10;
me=8000;
eg=0.001;
lr=0.4;                  %学习速率通常初始值在0.3~0.6之间。
tp=[df me eg lr];
%开始训练网络————————————————————————————————————————
[w1,b1,w2,b2,w3,b3,ep,tr]=trainlm(w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin',p,t,tp);
%pause

%实时绘制误差曲线——————————————————————————————————————
clc
plottr(tr,eg);          
%pause

%根据已经训练好的网络来仿真输出———————————————————————————————
echo off
a=simuff(p,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
%比较目标输出和仿真输出图形————————————————
acs=simuff(cs,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
%仿真出测试集的输出
   figure;
   plot(a);
   hold on
   plot(t,'r');
   title('货运量');
   %比较目标输出和仿真输出间相对误差—————————————
   %将归一化后的目标向量和仿真向量还原成原值,进行比较————————————————————
   %使用式p2=0.7*(primary(:,2)-minium(2))./(maxium(2)-minium(2))+0.2;反计算出原始数据!——   
   a=(a-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
   t=(t-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
   rate=((a-t)./t).*100;
   acs=(acs-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
   tcs=(tcs-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
   csrate=((acs-tcs)./tcs).*100;
   
   
   %预测2003年和2004年的货运量——————————————
        a2003=simuff(p2003,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
        
                           
                      p2004=[p2(22);
                             p2(23);
                             p2(24);
                             p2(25);
                             a2003];
        a2004=simuff(p2004,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
         %换算回来
        a2003=(a2003-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
        a2004=(a2004-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);


   
   
   
   
   
   
   
   
   
   
   
   %将训练和测试集的结果按循序排列,并与目标比较,若测试集效果好,则网络理想——————————   
   for i=1:10
      predict(2*i-1)=acs(i);      
      predict(2*i)=a(i);  
      target(2*i-1)=tcs(i);      
      target(2*i)=t(i); 
      relateerr(2*i-1)=csrate(i);      
      relateerr(2*i)=rate(i);
   end
   
   state=['                             这是货运量的神经网络模型']
   explain=['               预测值                          目标值               相对误差']
   compare=[predict' target' relateerr']
   
   figure;
   plot(target,'r-*');
   hold on
   
   l=length(predict);
   predict(l+1)=a2003;
   predict(l+2)=a2004;
   plot(predict,'b-+');
   a2003
   a2004

   
        

   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -