%rood_yunliang.m,公路客运量运量BP网络预测,2007年11月20-21日调试
%问题:用BP网络预测公路客运量
%现有某省1978~2002年的客运量数据,即时间序列有N=25个历史观察值,
%采用长度n=5为一期,n0=2为滚动间隔。即用前5年的数据预测下一年的数据,
%每隔2年开始一期长度为5年的观察数据。要求预测出2003年、2004年的客运量。
%分析:20期数据样本分成两组,每组10个,分别做为训练集(1978年开始)和
%测试集(1979年开始)。设计BP网络有5个输入,1个输出。采用双隐含层,
%隐含层神经元数目采用试差法确定,经试验,第1、2隐含层神经元数目分别为8、5,
%即BP网络设计为5-8-5-1。
%将表1中的输入、输出数据比例化到区间[0.2~0.9]内,并将初始权值随机化,取η=0 6,
%用1978年开始的10个训练集训练网络。经1979年开始的10个测试集测试。
%1978~2002年的客运量数据
%年份 客运量
%1978 12815
%1979 15543
%1980 19326
%1981 22864
%1982 26150
%1983 28468
%1984 30882
%1985 39375
%1986 45759
%1987 49589
%1988 52560
%1989 48726
%1990 51083
%1991 56495
%1992 62767
%1993 83606
%1994 92090
%1995 101370
%1996 107317
%1997 108654
%1998 111847
%1999 112872
%2000 116997
%2001 126007
%2002 128980
close all
clc;
clear;
%按年份排列的原始客运量数据
p0=[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];
%绘制客运量随年份的变换曲线
year=1978:2002;
plot(year,p0,'b+')
hold on
plot(year,p0,'b-.')
pause
%将原始数据归一化到[0.2 0.9]
%规一化公式:规一化后数据=z1+(z2-z1)*(x-xmin)/(xmax-xmin)
%[z1 z2]为规格化后的数据范围,如本例z1=0.2,z2=0.9;x为待规格化数据;
%xmin、xmax分别为数据序列的最小、最大值。
p1=0.2+(0.9-0.2).*(p0-min(p0))./(max(p0)-min(p0));
%绘制规一化后客运量随年份的变换曲线
%plot(year,p1)
%pause
%按每5年为一期组织样本,作为训练集,p为输入,t为目标。从第1978年客运量开始
j=0;
for i=1:10;
p(:,i)=p1(i+j:i+j+4); %取第i个训练样本,给p
t(:,i)=p1(i+j+5);
j=j+1;
end
p
t
pause
%按每5年为一期组织样本,作为测试集,testp为输入,testt为目标。从1979年客运量开始
j=0;
for i=1:10;
testp(:,i)=p1(i+j+1:i+j+5);
testt(:,i)=p1(i+j+6);
j=j+1;
end
%建立BP网络,两层隐含层,隐层神经元数为8、 5,输出为1个单元,训练函数为trainlm
net = newff(minmax(p),[8 5 1],{'tansig' 'tansig' 'purelin'},'trainlm');
%可以设计为一个隐含层的BP网络,隐层神经元数为14;因为数据规一化处理过,
%所以输出层传递函数也可以用'tansig'
%net = newff(minmax(p),[14 1],{'tansig' 'tansig'},'trainlm');
%可以用'trainlm','traingd',' traingdm',' traingda',' traingdx'分别训练网络,看不同训练函数的效果.
%设置训练参数
net.trainParam.lr=0.6; %学习率
net.trainParam.epochs = 10000; %最大训练次数
net.trainParam.goal = 0.0000001; %目标误差
%训练网络
net = train(net,p,t);
%仿真
y = sim(net,testp); %将1979起的10组测试数据输入网络进行测试
E=testt-y; %计算测试集网络输出和目标的误差
mse=MSE(E) %计算均方误差
%预测2003年客运情况
p03=p1(21:25)' %取预测数据,1998-2002共5年,转置成列矢量
y03=sim(net,p03) %用sim仿真,计算2003年客运量(规一化值)
y2003=min(p0)+(y03-0.2)*(max(p0)-min(p0))/0.7; %求出客运量实际值
p2=[p0 y2003]; %将2003年数据加入原始数据p0中
year=[year 2003]; %将2003年加入年份中
figure
plot(year,p2,'g-.')
hold on
plot(year,p2,'g+') %绘制包括2003年预测数据的客运量曲线
hold on
plot(2003,y2003,'ro') %用红色0绘制2003年预测的数据点。
pause
disp('2003年客运量预测值为:'),y2003
disp('程序运行结束');
海神之光
- 粉丝: 5w+
- 资源: 6110
最新资源
- C语言实现字符串逆序操作string-reverse
- 【java毕业设计】电影售票系统源码(ssm+mysql+说明文档).zip
- 【java毕业设计】大学生综合素质评分平台源码(ssm+mysql+说明文档+LW).zip
- Java实现字符串的逆序StringReverse
- 【java毕业设计】宠物医院信息管理系统源码(ssm+mysql+说明文档+LW).zip
- 【java毕业设计】员工在线知识培训考试平台源码(ssm+mysql+说明文档).zip
- 【java毕业设计】演出道具租赁管理系统源码(ssm+mysql+说明文档).zip
- ScanMaster RPP3 脉冲放大器手册
- 【java毕业设计】社区医院儿童预防接种管理系统源码(ssm+mysql+说明文档).zip
- 【java毕业设计】企业台账管理平台源码(ssm+mysql+说明文档+LW).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈