找回密码
 注册
Simdroid-非首页
查看: 655|回复: 8

matlab BP神经网络预测

[复制链接]
发表于 2007-10-28 23:14:57 | 显示全部楼层 |阅读模式 来自 甘肃兰州
:handshake 下面是我通过1986年到2000年的交通量 来预测2001年的交通量,为什么我运行后拟合比较好而预测数据与实际交通量有很大的差别,不知那个高手能给小弟指点一下这个程序是不是有问题,需要进行什么修改,如指点将不胜感激!!
clc
year=1986:2000;
p=[493 372 445;372 445 176;445 176 235;176 235 378;235 378 429;...
   378 429 561;429 561 651;561 651 467;651 467 527;467 527 668;...
   527 668 841; 668 841 526;841 526 480;526 480 567;480 567 685]';
t=[176 235 378 429 561 651 467 527 668 841 526 480 567 685 507];
%对原始数据进行规范化处理
[pn,meanp,stdp,tn,meant,stdt]=prestd(p,t);
%建立相应的BP网络
net = newff(minmax(pn),[7,1],{'tansig' 'purelin' },'traingdx');
%训练网络
net.trainParam.epochs = 10000;
net.trainParam.goal = 0.0001;
net = train(net,pn,tn);
%对训练后的网络进行仿真
an=sim(net,pn);
a=poststd(an,meant,stdt);
% 绘制仿真后图像
plot(year,t,'b-o',year,a,'r:x');
title('仿真后图像')
xlabel('年份');
ylabel('交通量(辆次/昼夜)');

p_new=[567 685 507]';
pn_new=trastd(p_new,meanp,stdp);
an_new=sim(net,pn_new);
a=poststd(an_new,meant,stdt)
发表于 2007-11-2 15:45:22 | 显示全部楼层 来自 江苏南京
Simdroid开发平台
神经网络预测内部的数据应该是准的,但外推的话就不好说了。你的2001年不在1986-2000之间,因此这数据预测不会太准。我也曾经做过材料方面的神经网络。
回复 不支持

使用道具 举报

发表于 2008-11-17 10:24:46 | 显示全部楼层 来自 陕西西安
不知道你需要的预测结果,及精度怎么要求
我更改了我的一个程序,把你的数据作为输入,也能得到比较好的预测结果,如果需要,你可以找我继续交流。

%bp神经网络进行交通预测的Matlab源代码
% BP 神经网络用于预测
% 使用平台 - Matlab7.0
% 数据为1986年到2000年的交通量 ,网络为3输入,1输出
% 15组数据,其中9组为正常训练数据,3组为变量数据,3组为测试数据
%by akjuan
%all rights preserved by www.4math.cn
%2008.11


clc
clear

All_error=[];%所有误差存储

%---------------------------------------------------
%原始数据
%---------------------------------------------------
year=1986:2000;%数据是从1986到2000年的

p=[493 372 445;372 445 176;445 176 235;176 235 378;235 378 429;...
   378 429 561;429 561 651;561 651 467;651 467 527;467 527 668;...
   527 668 841; 668 841 526;841 526 480;526 480 567;480 567 685]';%输入数据,共15组,每组3个输入
t=[176 235 378 429 561 651 467 527 668 841 526 480 567 685 507];%输出数据,共15组,每组1个输出


%---------------------------------------------------
%数据归一化处理,归一化数据到[-1,1],mapminmax函数调用形式
%[y,ps] =%mapminmax(x,ymin,ymax),x需归化的数据输入,
%ymin,ymax为需归化到的范围,不填默认为归化到[-1,1]
%返回归化后的值y,以及参数ps,ps在结果反归一化中,需要调用
%---------------------------------------------------
[normInput,ps] = mapminmax(p);
[normTarget,ts] = mapminmax(t);


%---------------------------------------------------
%数据乱序,及分类处理,将输入的15组数据,0.2%既3组,用来作为测试数据,
% 0.2%既3组,用来作为变化数据,另外9组用来正常输入,用来训练
%DIVIDEVEC用来重新随机抽取上述三种分类的数据,原来的顺序被打乱
%函数调用的语法[trainV,valV,testV] = dividevec(p,t,valPercent,testPercent)
%输入p为输入数据,t为输出数据,valPercent为训练用的变化数据在总输入中的百分比
%testPercent为训练用的测试数据在总输入中的百分比
%输出trainV,valV,testV分别为按乱序及相应百分比,得到的数据
%另外,打乱后的数据,p和t都是对应的,请放心使用
%---------------------------------------------------
testPercent = 0.20;  % Adjust as desired
validatePercent = 0.20;  % Adust as desired
[trainSamples,validateSamples,testSamples] = dividevec(normInput,normTarget,validatePercent,testPercent);

for j=1:200
%---------------------------------------------------
% 设置网络参数
%---------------------------------------------------   
NodeNum1 = 20; % 隐层第一层节点数
NodeNum2=40;   % 隐层第二层节点数
TypeNum = 1;   % 输出维数

TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig';%各层传输函数,TF3为输出层传输函数
%如果训练结果不理想,可以尝试更改传输函数,以下这些是各类传输函数
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';


net=newff(minmax(normInput),[NodeNum1,NodeNum2,TypeNum],{TF1 TF2 TF3},'traingdx');%网络创建



%---------------------------------------------------
% 设置训练参数
%---------------------------------------------------   
net.trainParam.epochs=10000;%训练次数设置
net.trainParam.goal=1e-6;%训练目标设置
PL.lr=0.01;%学习率设置,应设置为较少值,太大虽然会在开始加快收敛速度,但临近最佳点时,会产生动荡,而致使无法收敛
%---------------------------------------------------
% 指定训练参数

% net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 动量梯度下降算法
%
% net.trainFcn = 'traingda'; % 变学习率梯度下降算法
% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法
%
% (大型网络的首选算法)
% net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小
%
% 共轭梯度算法
% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves修正算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大
% (大型网络的首选算法)
%net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多
%
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS算法小,比共轭梯度算法略大
%
% (中型网络的首选算法)
%net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快
%
% net.trainFcn = 'trainbr'; % 贝叶斯正则化算法
%
% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm'

net.trainfcn='traingdm';
[net,tr] = train(net,trainSamples.P,trainSamples.T,[],[],validateSamples,testSamples);

%---------------------------------------------------
% 训练完成后,就可以调用sim()函数,进行仿真了
%---------------------------------------------------   
[normTrainOutput,Pf,Af,E,trainPerf] = sim(net,trainSamples.P,[],[],trainSamples.T);%正常输入的9组p数据,BP得到的结果t
[normValidateOutput,Pf,Af,E,validatePerf] = sim(net,validateSamples.P,[],[],validateSamples.T);%用作变量3的数据p,BP得到的结果t
[normTestOutput,Pf,Af,E,testPerf] = sim(net,testSamples.P,[],[],testSamples.T);%用作测试的3组数据p,BP得到的结果t


%---------------------------------------------------
% 仿真后结果数据反归一化,如果需要预测,只需将预测的数据P填入
% 将获得预测结果t
%---------------------------------------------------  
trainOutput = mapminmax('reverse',normTrainOutput,ts);%正常输入的9组p数据,BP得到的归一化后的结果t
trainInsect = mapminmax('reverse',trainSamples.T,ts);%正常输入的9组数据t
validateOutput = mapminmax('reverse',normValidateOutput,ts);%用作变量3的数据p,BP得到的归一化的结果t
validateInsect = mapminmax('reverse',validateSamples.T,ts);%用作变量3的数据t
testOutput = mapminmax('reverse',normTestOutput,ts);%用作变量3组数据p,BP得到的归一化的结果t
testInsect = mapminmax('reverse',testSamples.T,ts);%用作变量3组数据t

%绝对误差计算
absTrainError = trainOutput-trainInsect;
absTestError = testOutput-testInsect;
error_sum=sqrt(absTestError(1).^2+absTestError(2).^2+absTestError(3).^2);
All_error=[All_error error_sum];
eps=90;%其为3组测试数据的标准差,或者每个数据偏差在一定范围内而判别
if ((abs(absTestError(1))<=30 )&(abs(absTestError(2))<=30)&(abs(absTestError(3))<=30)|(error_sum<=eps))
save mynetdata net
     break
end
j
end
j
Min_error_sqrt=min(All_error)

testOutput
testInsect

%---------------------------------------------------
% 数据分析和绘图
%---------------------------------------------------  
figure
plot(1:12,[trainOutput validateOutput],'b-',1:12,[trainInsect validateInsect],'g--',13:15,testOutput,'m*',13:15,testInsect,'ro');

title('o为真实值,*为预测值')

xlabel('年份');
ylabel('交通量(辆次/昼夜)');

figure
xx=1:length(All_error);
plot(xx,All_error)
title('误差变化图')

程序运行结果net数据附件这里有:
http://www.4math.cn/thread-791-1-1.html

[ 本帖最后由 akjuan 于 2008-11-17 10:26 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-4-1 10:35:29 | 显示全部楼层 来自 山西太原
试了一下整个程序
我用的也是matlab7平台。可是mapminmax、dividevec函数没有找到,
看来需要改用premnmx?!
回复 不支持

使用道具 举报

发表于 2009-11-5 19:37:07 | 显示全部楼层 来自 福建福州
premnmx也是可以的 我试过

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-8-17 17:00:50 | 显示全部楼层 来自 河北唐山
3# 刚开始学习。没有看出前辈j循环的作用,可否指点一下?akjuan
回复 不支持

使用道具 举报

发表于 2010-8-19 16:21:02 | 显示全部楼层 来自 陕西西安
根据我做过的一个东西,我觉得神经网络隐层的数据太少了吧,多一些我认为结果会好些,毕竟BP是自己学自己,样本数据得多,全面些

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-8-21 10:25:43 | 显示全部楼层 来自 山西太原
我觉得是数据太少,预测结果会受到影响.
回复 不支持

使用道具 举报

发表于 2011-5-5 19:38:40 | 显示全部楼层 来自 上海
j循环的作用是什么,能否指教啊 3# akjuan
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 19:31 , Processed in 0.051836 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表