BP神经网络程序问题求助
这是我从书上打下来的代码,因为书的运行软件版本比较低,我的是Malab2013a的版本,所以我修改了部分程序,但运行出来有问题。请哪位高手帮忙指教和修正一下。谢谢!!%原始数据输入
clc
sqrs=[20.55,22.44,25.73,27.13,29.45,30.1,30.96,34.06,36.42,38.09,39.13,39.99,...
41.93,44.59,47.30,52.89,55.73,56.76,59.17,60.63];
sqjdcs=[0.6,0.75,0.85,0.90,1.05,1.35,1.45,1.60,1.70,1.85,2.15,2.20,2.25,2.35,...
2.5,2.6,2.7,2.85,2.95,3.10];
sqglmj=[0.09,0.11,0.11,0.14,0.20,0.23,0.23,0.32,0.32,0.34,0.36,0.36,0.38,0.49,...
0.56,0.59,0.59,0.67,0.69,0.79];
glkyl=[5126,6217,7730,9145,10460,11387,12353,15750,18304,19836,21024,19490,20433,...
22598,25107,33442,36836,40548,42927,43462];
glhyl=[1237,1379,1385,1399,1663,1714,1834,4322,8132,8936,11099,11203,10524,11115,...
13320,16762,18673,20724,20803,21804];
p=;
t=;
%数据归一化
=mapminmax(p);
=mapminmax(t);
dx=[-1,1;-1,1;-1,1];
%BP网络训练
net=newff(p,t,,{'tansig','tansig','purelin'},'traingdx');
net.trainParam.show=1000;
net.trainParam.Lr=0.05;
net.trainParam.epochs=50000;
net.trainParam.goal=0.65*10^(-3);
net=train(net,pn,tn);
%利用原数据对BP网络仿真
an=sim(net,pn);
a=mapminmax('reverse',an,ps2);
%仿真结果与原数据对比测试
x=1990:2009;
newk=a(1,:);
newh=a(2,:);
figure(2);
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+');
legend('网络输出客运量','实际客运量');
xlabel('年份');ylabel('货运量、万人');
title('运用工具箱客运量学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+');
legend('网络输出货运量','实际货运量');
xlabel('年份');ylabel('货运量、万吨');
title('运用工具箱货运量学习和测试对比图');
%新数据仿真
pnew=[73.39,75.55
3.9635,4.0975
0.9880,1.0268];
pnewn=mapminmax('apply',pnew,ps1);
anewn=sim(net,pnewn);
anew=mapminmax('reverse',anewn,ps2)
看了图我感觉是网络输出后面那几个值太大了,前面基本都是一条水平线了,具体哪里还看不出问题。你把修改的地方说一下看看 {:3_55:}{:3_55:}{:3_55:} gancm 发表于 2014-7-19 12:30 static/image/common/back.gif
看了图我感觉是网络输出后面那几个值太大了,前面基本都是一条水平线了,具体哪里还看不出问题。你把修改的 ...
因为版本更新,Matlab中的Newff命令用法有所改变,原命令为:
net=newff(dx,{'tansig','tansig','purelin'},'traingdx');
我修改为:
net=newff(p,t,,{'tansig','tansig','purelin'},'traingdx');
然后有些命令被其他命令替代了,其中有premnmx,postmnmx,tramnmx命令好像被替换了,使用了一个强大的命令mapminmax。原命令为:
=premnmx(p,t);
a=postmnmx(an,mint,maxt);
pnewn=tramnmx(pnew,minp,maxp);
anew=postmnmx(anewn,mint,maxt)
我修改为:
=mapminmax(p);=mapminmax(t);
a=mapminmax('reverse',an,ps2);
pnewn=mapminmax('apply',pnew,ps1);
anew=mapminmax('reverse',anewn,ps2)
原程序为:
%原始数据输入
clc
sqrs=[20.55,22.44,25.73,27.13,29.45,30.1,30.96,34.06,36.42,38.09,39.13,39.99,...
41.93,44.59,47.30,52.89,55.73,56.76,59.17,60.63];
sqjdcs=[0.6,0.75,0.85,0.90,1.05,1.35,1.45,1.60,1.70,1.85,2.15,2.20,2.25,2.35,...
2.5,2.6,2.7,2.85,2.95,3.10];
sqglmj=[0.09,0.11,0.11,0.14,0.20,0.23,0.23,0.32,0.32,0.34,0.36,0.36,0.38,0.49,...
0.56,0.59,0.59,0.67,0.69,0.79];
glkyl=[5126,6217,7730,9145,10460,11387,12353,15750,18304,19836,21024,19490,20433,...
22598,25107,33442,36836,40548,42927,43462];
glhyl=[1237,1379,1385,1399,1663,1714,1834,4322,8132,8936,11099,11203,10524,11115,...
13320,16762,18673,20724,20803,21804];
p=;
t=;
%数据归一化
=premnmx(p,t);
dx=[-1,1;-1,1;-1,1];
%BP网络训练
net=newff(dx,,{'tansig','tansig','purelin'},'traingdx');
net.trainParam.show=1000;
net.trainParam.Lr=0.05;
net.trainParam.epochs=50000;
net.trainParam.goal=0.65*10^(-3);
net=train(net,pn,tn);
%利用原数据对BP网络仿真
an=sim(net,pn);
a=postmnmx(an,mint,maxt);
%仿真结果与原数据对比测试
x=1990:2009;
newk=a(1,:);
newh=a(2,:);
figure(2);
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+');
legend('网络输出客运量','实际客运量');
xlabel('年份');ylabel('货运量、万人');
title('运用工具箱客运量学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+');
legend('网络输出货运量','实际货运量');
xlabel('年份');ylabel('货运量、万吨');
title('运用工具箱货运量学习和测试对比图');
%新数据仿真
pnew=[73.39,75.55
3.9635,4.0975
0.9880,1.0268];
pnewn=tramnmx(pnew,minp,maxp);
anewn=sim(net,pnewn);
anew=postmnmx(anewn,mint,maxt)
修改后程序为:
%原始数据输入
clc
sqrs=[20.55,22.44,25.73,27.13,29.45,30.1,30.96,34.06,36.42,38.09,39.13,39.99,...
41.93,44.59,47.30,52.89,55.73,56.76,59.17,60.63];
sqjdcs=[0.6,0.75,0.85,0.90,1.05,1.35,1.45,1.60,1.70,1.85,2.15,2.20,2.25,2.35,...
2.5,2.6,2.7,2.85,2.95,3.10];
sqglmj=[0.09,0.11,0.11,0.14,0.20,0.23,0.23,0.32,0.32,0.34,0.36,0.36,0.38,0.49,...
0.56,0.59,0.59,0.67,0.69,0.79];
glkyl=[5126,6217,7730,9145,10460,11387,12353,15750,18304,19836,21024,19490,20433,...
22598,25107,33442,36836,40548,42927,43462];
glhyl=[1237,1379,1385,1399,1663,1714,1834,4322,8132,8936,11099,11203,10524,11115,...
13320,16762,18673,20724,20803,21804];
p=;
t=;
%数据归一化
=mapminmax(p);
=mapminmax(t);
%BP网络训练
net=newff(p,t,,{'tansig','tansig','purelin'},'traingdx');
net.trainParam.show=1000;
net.trainParam.Lr=0.05;
net.trainParam.epochs=50000;
net.trainParam.goal=0.65*10^(-3);
net=train(net,pn,tn);
%利用原数据对BP网络仿真
an=sim(net,pn);
a=mapminmax('reverse',an,ps2);
%仿真结果与原数据对比测试
x=1990:2009;
newk=a(1,:);
newh=a(2,:);
figure(2);
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+');
legend('网络输出客运量','实际客运量');
xlabel('年份');ylabel('货运量、万人');
title('运用工具箱客运量学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+');
legend('网络输出货运量','实际货运量');
xlabel('年份');ylabel('货运量、万吨');
title('运用工具箱货运量学习和测试对比图');
%新数据仿真
pnew=[73.39,75.55
3.9635,4.0975
0.9880,1.0268];
pnewn=mapminmax('apply',pnew,ps1);
anewn=sim(net,pnewn);
anew=mapminmax('reverse',anewn,ps2)
(修改的地方用颜色标记了)
麻烦您帮忙指出其中的问题,万分感谢! 求书名及页码…… clc
sqrs=[20.55,22.44,25.73,27.13,29.45,30.1,30.96,34.06,36.42,38.09,39.13,39.99,...
41.93,44.59,47.30,52.89,55.73,56.76,59.17,60.63];
sqjdcs=[0.6,0.75,0.85,0.90,1.05,1.35,1.45,1.60,1.70,1.85,2.15,2.20,2.25,2.35,...
2.5,2.6,2.7,2.85,2.95,3.10];
sqglmj=[0.09,0.11,0.11,0.14,0.20,0.23,0.23,0.32,0.32,0.34,0.36,0.36,0.38,0.49,...
0.56,0.59,0.59,0.67,0.69,0.79];
glkyl=[5126,6217,7730,9145,10460,11387,12353,15750,18304,19836,21024,19490,20433,...
22598,25107,33442,36836,40548,42927,43462];
glhyl=[1237,1379,1385,1399,1663,1714,1834,4322,8132,8936,11099,11203,10524,11115,...
13320,16762,18673,20724,20803,21804];
p=;
t=;
%数据归一化
=mapminmax(p);
=mapminmax(t);
%dx=[-1,1;-1,1;-1,1];
p0=minmax(pn);t0=minmax(tn);
%BP网络训练
net=newff(p0,t0,,{'tansig','tansig','purelin'},'traingdx');
net.trainParam.show=1000;
net.trainParam.Lr=0.05;
net.trainParam.epochs=50000;
net.trainParam.goal=0.65*10^(-5);
net=train(net,pn,tn);
%利用原数据对BP网络仿真
an=sim(net,pn);
a=mapminmax('reverse',an,ps2);
%仿真结果与原数据对比测试
x=1990:2009;
newk=a(1,:);
newh=a(2,:);
figure(2);
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+');
legend('网络输出客运量','实际客运量');
xlabel('年份');ylabel('货运量、万人');
title('运用工具箱客运量学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+');
legend('网络输出货运量','实际货运量');
xlabel('年份');ylabel('货运量、万吨');
title('运用工具箱货运量学习和测试对比图');
%新数据仿真
pnew=[73.39,75.55
3.9635,4.0975
0.9880,1.0268];
pnewn=mapminmax('apply',pnew,ps1);
anewn=sim(net,pnewn);
anew=mapminmax('reverse',anewn,ps2) 忽略我上面那个,改动的地方在18,21,25行……求批clc
sqrs=[20.55,22.44,25.73,27.13,29.45,30.1,30.96,34.06,36.42,38.09,39.13,39.99,...
41.93,44.59,47.30,52.89,55.73,56.76,59.17,60.63];
sqjdcs=[0.6,0.75,0.85,0.90,1.05,1.35,1.45,1.60,1.70,1.85,2.15,2.20,2.25,2.35,...
2.5,2.6,2.7,2.85,2.95,3.10];
sqglmj=[0.09,0.11,0.11,0.14,0.20,0.23,0.23,0.32,0.32,0.34,0.36,0.36,0.38,0.49,...
0.56,0.59,0.59,0.67,0.69,0.79];
glkyl=[5126,6217,7730,9145,10460,11387,12353,15750,18304,19836,21024,19490,20433,...
22598,25107,33442,36836,40548,42927,43462];
glhyl=[1237,1379,1385,1399,1663,1714,1834,4322,8132,8936,11099,11203,10524,11115,...
13320,16762,18673,20724,20803,21804];
p=;
t=;
%数据归一化
=mapminmax(p);
=mapminmax(t);
%dx=[-1,1;-1,1;-1,1];
p0=minmax(pn);t0=minmax(tn);
%BP网络训练
net=newff(p0,t0,,{'tansig','tansig','purelin'},'traingdx');
net.trainParam.show=1000;
net.trainParam.Lr=0.05;
net.trainParam.epochs=50000;
net.trainParam.goal=0.65*10^(-5);
net=train(net,pn,tn);
%利用原数据对BP网络仿真
an=sim(net,pn);
a=mapminmax('reverse',an,ps2);
%仿真结果与原数据对比测试
x=1990:2009;
newk=a(1,:);
newh=a(2,:);
figure(2);
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+');
legend('网络输出客运量','实际客运量');
xlabel('年份');ylabel('货运量、万人');
title('运用工具箱客运量学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+');
legend('网络输出货运量','实际货运量');
xlabel('年份');ylabel('货运量、万吨');
title('运用工具箱货运量学习和测试对比图');
%新数据仿真
pnew=[73.39,75.55
3.9635,4.0975
0.9880,1.0268];
pnewn=mapminmax('apply',pnew,ps1);
anewn=sim(net,pnewn);
anew=mapminmax('reverse',anewn,ps2) 且生 发表于 2014-7-21 18:22 static/image/common/back.gif
忽略我上面那个,改动的地方在18,21,25行……求批
确实改善了很多,很是感谢。但效果还是不太理想,而且为何只学习了几十次就停了呢?即使我修改了目标精度。 %BP网络训练
net=newff(p0,t0,6,{'tansig'},'traingd');
net.trainParam.show=1000;
net.trainParam.Lr=0.05;
net.trainParam.epochs=2000;
net.trainParam.goal=0.65*10^(-4);
net=train(net,pn,tn);我只改了这里面的,
一、改成单隐含层的,6个节点
二、训练函数改成梯度下降BP算法 traingd
三、迭代次数改成2000
上面的参数是自己试的,我也不知道为什么。
由于这玩意儿比较不靠谱,楼主多运行几次就能找到拟合的比较好的网络。
关键问题是有没有过拟合我也不知道,等大神来解答吧 因为样本比较少,所以训练函数没有选会调节学习率的
页:
[1]
2