T-Eric 发表于 2014-7-18 21:13

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)

gancm 发表于 2014-7-19 12:30

看了图我感觉是网络输出后面那几个值太大了,前面基本都是一条水平线了,具体哪里还看不出问题。你把修改的地方说一下看看

529084167 发表于 2014-7-21 09:35

{:3_55:}{:3_55:}{:3_55:}

T-Eric 发表于 2014-7-21 11:58

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)
(修改的地方用颜色标记了)
麻烦您帮忙指出其中的问题,万分感谢!

且生 发表于 2014-7-21 18:05

求书名及页码……

且生 发表于 2014-7-21 18:20

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

忽略我上面那个,改动的地方在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)

T-Eric 发表于 2014-7-22 21:14

且生 发表于 2014-7-21 18:22 static/image/common/back.gif
忽略我上面那个,改动的地方在18,21,25行……求批

确实改善了很多,很是感谢。但效果还是不太理想,而且为何只学习了几十次就停了呢?即使我修改了目标精度。

且生 发表于 2014-7-22 23:35

%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
上面的参数是自己试的,我也不知道为什么。
由于这玩意儿比较不靠谱,楼主多运行几次就能找到拟合的比较好的网络。
关键问题是有没有过拟合我也不知道,等大神来解答吧

且生 发表于 2014-7-22 23:36

因为样本比较少,所以训练函数没有选会调节学习率的
页: [1] 2
查看完整版本: BP神经网络程序问题求助