广义回归神经网络(GRNN, generalized regression neural network)是美国学者Specht在1991年提出的,是径向基神经网络的一种,GRNN具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性,适用于解决非线性问题。GRNN在逼近能力和学习速度上较RBF网络有更强的优势,网络最后收敛于样本量积聚较多的优化回归面,并且在样本数据较少时,预测效果也较好。此外,网络还可以处理不稳定的数据。因此,GRNN在信号过程、结构分析、教育、能源、食品、药物、金融、生物等各个领域得到了广泛的应用。

GRNN由四层组成,分别为输入层、模式层、求和层和输出层。理论基础是非线性回归分析,Y相对于X的回归分析实际上是计算具有最大概率值的y。

运输系统作为社会经济系统中的一个子系统,在受外界因素影响和作用的同时,对外部经济也具有一定的反作用,使得运输需求同时受到来自运输系统内外两方面的影响。运输需求预测在国家和区域经济发展规划中具有十分重要的作用,其中,由于货物运输和地方经济及企业发展的紧密联系,货运需求预测成为货运需求和经济发展关系研究中的一个重要问题。因此,作为反映货物运输需求的一项重要指标,货运量预测研究和分析具有较强的实际和理论意义。

常见的货运量预测方法主要是时间序列方法和灰色预测方法。大都集中在对其因果关系回归模型和时间序列模型的分析上,所建立的模型不能全面、科学和本质地反映所预测动态数据的内在结构和复杂特性,丢失了信息量。人工神经网络作为一种并行的计算模型,具有传统建模方法所不具备的很多优点,有很好的非线性映射能力,对被建模对象的先验知识要求不多,一般不必事先知道有关被建模对象的结构、参数、动态特性等方面的知识,只需给出对象的输入、输出数据,通过网络本身的学习功能就可以达到输入与输出的完全符合。

根据货运量影响因素的分析,分别取GDP、IP、铁路运输线路长度、复线里程比重、公路运输线路长度、等级公路比重、铁路货车数量和民用载货汽车数量8项指标作为输入,以货运总量、铁路货运量和公路货运量3项指标作为网络输出,构建GRNN,由于训练数据较少,采取交叉验证方法训练GRNN神经网络,并用循环找出最佳的SPREAD。

load data;
p_train=p(1:12,:);
t_train=t(1:12,:);
p_test=p(13,:);
t_test=t(13,:);
% %交叉验证
desired_spread=[];
mse_max=10e20;
desired_input=[];
desired_output=[];
result_perfp=[];
indices=crossvalid('Kfold',length(p_train),4);
h=waitbar(0,'正在寻找最优化参数......')
k=1;
for i=1:4
      perfp=[];
      disp(['以下为第',num2str(i),'次交叉验证结果'])
      test=(indices==i);train=~test;
      p_cv_train=p_train(train,:);
      t_cv_train=t_train(train,:);
      p_cv_test=p_train(test,:);
      t_cv_test=t_train(test,:);
      p_cv_train=p_cv_train';
      t_cv_train=t_cv_train';
      p_cv_test=p_cv_test';
      t_cv_test=t_cv_test';
  
[p_cv_train,minp,maxp,t_cv_train,mint,maxt]=premnmx(p_cv_train,t_cv_train);
p_cv_test=tramnmx(p_cv_test,minp,maxp);
for spread=0.1:0.1:2;
      net=newgrnn(p_cv_train,t_cv_train,spread);
      waitbar(k/80,h);
      disp(['当前spread值为',num2str(spread)]);
      test_Out=sim(net,p_cv_test);
      test_Out=postmnmx(test_Out,mint,maxt);
      error=t_cv_test-test_Out;
      disp(['当前网络的mse为',num2str(mse(error))])
      perfp=[perfp mse(error)];
      if mse(error)<mse_max
            mse_max=mse(error);
            desired_spread=spread;
            desired_input=p_cv_train;
            desired_output=t_cv_train;
      end
      k=k+1;
  end
  result_perf(i,:)=perfp;
end;
close(h)
disp(['最佳spread值为',num2str(desired_spread)])
disp(['此时最佳输入值为',num2str(desired_input)])
disp(['此时最佳输出值为',num2str(desired_output)])
%%采用最佳方法建立GRNN网络
net=newgrnn(desired_input,desired_output,desired_spread);
p_test=p_test';
p_test=tramnmx(p_test,minp,maxp);
grnn_prediction_result=sim(net,p_test);
grnn_predictioin_result=postmnmx(grnn_prediction_result,mint,maxt);
grnn_error=t_test-grnn_prediction_result';
disp('GRNN神经网络三项流量预测的误差为')
abs(grnn_error)
save best desired_input desired_output p_test t_test grnn_error mint maxt

      

SPREAD值越小,网络对样本的逼近性就越强;SPREAD值越大,网络对样本数据的逼近过程越平滑,但误差也相应增大。因此选用最佳的SPREAD值非常重要。

GRNN神经网络和BP网络都可以用于货运量等的预测,但对具体的网络训练来说,GRNN需要调整的参数较少,只有一个SPREAD参数,因此可以更快的预测网络,具有较大的计算优势。

下面将针对本案例数据,使用BP神经网络模型预测得出的流量数据。

load best
n=13
p=desired_input
t=desired_output
net_bp=newff(minmax(p),[n,3],('tansig','purelin','trainlm'));
%训练网络
net.trainParam.show=50;
net.trainParam.epochs=2000;
net.trainParam.goal=1e-3;
%调用trainlm算法训练BP网络
net_bp=train(net_bp,p,t);
bp_prediction_result=sim(net_bp,p_test);
bp_prediction_result=postmnmx(bp_prediction_result,mint,maxt);
bp_error=t_test-bp_prediction_result';
disp(['BP神经网络三项流量预测的误差为',num2str(abs(bp_error))])