赞
踩
广义回归神经网络(GRNN Generalized Regression Neural Network)是美国学者 Don-ald F. Specht在1991年提出的,它是径向基神经网络的一种。GRNN具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性,适用于解决非线性问题。GRNN 在逼近能力和学习速度上较RBF网络有更强的优势,网络最后收敛于样本量积聚较多的优化回归面,并且在样本数据较少时,预测效果也较好。此外,网络还可以处理不稳定的数据。因此,GRNN 在信号过程、结构分析、教育产业,能源、食品科学、控制决策系统、药物设计、金融领域、生物工程等各个领域得到了广泛的应用。
广义回归神经网络的理论基础是非线性回归分析,非独立变量Y相对于独立变量工的回归分析实际上是计算具有最大概率值的y。设随机变量x和随机变量y的联合概率密度函数为f(z,y),已知工的观测值为X,则y相对于X的回归,也即条件均值为
运输系统作为社会经济系统中的一个子系统,在受外界因素影响和作用的同时,对外部经济系统也具有一定的反作用,使得运输需求同时受到来自运输系统内外两方面因素的影响。作为运输基础设施建设投资决策的基础,运输需求预测在国家和区域经济发展规划中具有十分重要的作用,其中,由于货物运输和地方经济及企业发展的紧密联系,货运需求预测成为货运需求和经济发展关系研究中的一个重要问题。因此,作为反映货物运输需求的一项重要指标,货运量预测研究和分析具有较强的实际和理论意义。
常用的货运量预测方法包括时间序列方法、移动平滑法、指数平滑法、随机时间序列方法、相关、回归分析法以及灰色预测方法和多种方法综合的组合预测方法等。这些方法大都集中在对其因果关系回归模型和时间序列模型的分析上,所建立的模型不能全面、科学和本质地反映所预测动态数据的内在结构和复杂特性,丢失了信息量。人工神经网络作为-种并行的计算模型,具有传统建模方法所不具备的很多优点:有很好的非线性映射能力,对被建模对象的先验知识要求不多,一般不必事先知道有关被建模对象的结构、参数、动态特性等方面的知识,只需给出对象的输入,输出数据,通过网络本身的学习功能就可以达到输人与输出的完全符合。
在此情况下,国内一些学者将神经网络引入到货运量预测中来。但BP神经网络在用于函数逼近时,存在收敛速度慢和局部极小等缺点,在解决样本量少而且噪声较多问题时效果并不理想。GRNN在逼近能力、分类能力和学习速度方面具有较强优势,网络最后收敛于样本量积聚最多的优化回归面,并且在数据缺乏时效果也较好。网络可以处理不稳定的数据,因此本案例采用GRNN建立了货运量预测模型,并利用历史统计数据对货运量进行预测。
根据货运量影响因素的分析,分别取国内生产总值(GDP)、工业总产值,铁路运输线路长度、复线里程比重、公路运输线路长度,等级公路比重﹑铁路货车数量和民用载货汽车数量8项指标因素作为网络输入,以货运总量﹑铁路货运量和公路货运量3项指标因素作为网络输出,构建 GRNN,由于训练数据较少,采取交叉验证方法训练GRNN神经网络,并用循环找出最佳的SPREAD。
本案例中data. mat中共有p,t两组数据,又各含13组数据,代表了1996—2008年的货运量和与其相关的各个变量值。将p、t的前12组数据作为网络的训练数据,最后1组数据作为网络的预测数据,建立 GRNN 神经网络对货运量进行预测。
GRNN网络的相关函数,其函数名称为newgrnn().该函数可用于设计一个广义回归神经网络。广义回归神经网络是RBF网络的一种,通常用于函数逼近,其调用格式为
net = newgrnn(P.T,SPREAD)
其中,P为Q组输入向量组成的R*Q维矩阵;T为Q组目标分类向量组成的S*Q维矩阵;SPREAD为径向基函数的扩展速度,默认值为1。
根据上面确定的网络输入和输出,利用1996—2007年某地的历史数据作为网络的训练样本,2008年的数据作为网络的外推测试样本。代码如下:
- %% Matlab神经网络43个案例分析
-
-
-
- %% 清空环境变量
- clc;
- clear all
- close all
- nntwarn off;
-
- %% 载入数据
- 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 = crossvalind('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_perfp(i,:)=perfp;
- end;
- close(h)
- disp(['最佳spread值为',num2str(desired_spread)])
- disp(['此时最佳输入值为'])
- desired_input
- disp(['此时最佳输出值为'])
- 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_prediction_result=postmnmx(grnn_prediction_result,mint,maxt);
- grnn_error=t_test-grnn_prediction_result';
- disp(['GRNN神经网络三项流量预测的误差为',num2str(abs(grnn_error))])
- save best desired_input desired_output p_test t_test grnn_error mint maxt
-
运行结果如下:
- 最佳spread值为0.5
- 此时最佳输入值为
-
- desired_input =
-
- -1.0000 -0.8993 -0.7948 -0.5023 -0.2955 -0.0574 0.1602 0.6652 1.0000
- -0.9998 -1.0000 -0.1291 -0.0072 0.2070 0.3417 0.5137 0.7838 1.0000
- -1.0000 -0.8616 -0.4969 -0.4969 0.1950 0.3333 0.4465 0.6604 1.0000
- -1.0000 -0.5385 -0.0769 0.5385 0.2308 0.3846 0.3846 0.6923 1.0000
- -1.0000 -0.9429 -0.9175 -0.7778 -0.5937 -0.3270 -0.0286 0.5619 1.0000
- -1.0000 -1.0000 -1.0000 -0.5000 -0.3000 -0.2000 0.0000 0.5000 1.0000
- 0.0141 -1.0000 0.0187 0.0187 0.2477 0.3682 0.4944 0.7735 1.0000
- -1.0000 -0.9211 -0.8826 -0.9563 -0.7786 -0.6099 -0.3042 0.2843 1.0000
-
- 此时最佳输出值为
-
- desired_output =
-
- -1.0000 -0.9839 -0.9838 -0.7127 -0.4503 -0.2463 0.0126 0.5394 1.0000
- -1.0000 -0.9040 -0.8604 -0.6403 -0.3950 -0.2293 -0.0769 0.4116 1.0000
- -1.0000 -0.8020 -0.8042 -0.5446 -0.2471 -0.0500 0.0416 0.4693 1.0000
-
- GRNN神经网络三项流量预测的误差为9959.185 1777.8231 14498.027
由程序运行后的结果中看出,SPREAD值设置为0.5时,训练数据的预测较好。SPREAD值越小,网络对样本的逼近性就越强;SPREAD值越大,网络对样本数据的逼近过程就越平滑,但误差也相应增大。在实际应用时,为了选取最佳的SPREAD值,一般采取本案例中循环训练的方法,从而达到最好的预测效果。
GRNN神经网络和BP网络都可以用于货运量等的预测,但对具体的网络训练来说,GRNN需要调整的参数较少,只有一个SPREAD参数,因此可以更快地预测网络,具有较大的计算优势。下面将针对本案例数据,使用BP神经网络模型预测得出的流量数据。代码如下:
- %% 以下程序为案例扩展里的GRNN和BP比较 需要load chapter8.1的相关数据
- clear all
- 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))])
运行结果:
BP神经网络三项流量预测的误差为6967.20678 11142.5527 4156.17376
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。