声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1871|回复: 13

[综合讨论] 大伙看看我这个用matlab编的BP网络,咋差距就这么大?

[复制链接]
发表于 2007-7-11 16:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
这是用matlab编写的

clear
fid=fopen('d:\ann\p0.txt','r');
P=fscanf(fid,'%g',[4 20]); %P为训练样本输入矢量
fid=fopen('d:\ann\t0.txt','r');
T=fscanf(fid,'%g',[1 20]); %T为训练样本目标矢量
fid=fopen('d:\ann\p1.txt','r');
PP=fscanf(fid,'%g',[4 4]); %PP为检验样本输入矢量
fid=fopen('d:\ann\t1.txt','r');
TT=fscanf(fid,'%g',[1 4]); %TT为检验样本目标矢量
net=newff(minmax(P),[5,1],{'tansig','purelin'},'trainlm');
net=init(net);
net.trainParam.epochs=50000; %设置网络训练次数为50000次
net.trainParam.show=50; %设置每隔50次显示当前网络训练误差
net.trainParam.goal=0.01; %设置网络训练目标误差为0.01
[net,tr]=train(net,P,T); %利用函数train()对网络进行训练
A=sim(net,P); %利用函数sim()对训练年份和检验年份进行仿真
AA=sim(net,PP);  
T1=1:1:20;
plot(T1,T,T1,A);
T2=1:1:4;
plot(T2,TT,T2,AA);
回复
分享到:

使用道具 举报

发表于 2007-7-11 16:58 | 显示全部楼层
楼主到底想表达什么东西?
 楼主| 发表于 2007-7-11 17:00 | 显示全部楼层
分别为:1.我用到的数据

数据.doc

52.5 KB, 下载次数: 16

我用到的总数据

p0.txt

431 Bytes, 下载次数: 24

p1.txt

90 Bytes, 下载次数: 20

t0.txt

102 Bytes, 下载次数: 17

t1.txt

24 Bytes, 下载次数: 18

Doc1.doc

97 KB, 下载次数: 17

文献中的结果

 楼主| 发表于 2007-7-11 17:01 | 显示全部楼层
那位文献的作者运行的结果,极其理想,而我模拟的极不好
 楼主| 发表于 2007-7-11 17:02 | 显示全部楼层
由于那个文献容量过大,我无法上传全部,只能截取最终结果的一页

该文献具体为:“陈集中。应用人工神经网络BP模型预测乌江流域年平均含沙量。2005,25(4):6-9”
发表于 2007-7-11 17:04 | 显示全部楼层
参数设置也很重要的
尤其对于不同的数据
论坛上不少关于BP网络的讨论
先搜索一下吧!
 楼主| 发表于 2007-7-11 22:24 | 显示全部楼层
搜索了,也自己试着修改了,可惜效果还是不行,还望给予指点!
发表于 2007-7-12 09:01 | 显示全部楼层
对于训练样本,可以很容易达到均方差(RMSE)为1e-10,效果非常好啊!验证的结果就要差远了。
发表于 2007-7-12 11:35 | 显示全部楼层
  1. clear
  2. P=load('p0.txt');
  3. T=load('t0.txt');
  4. PP=load('p1.txt')
  5. TT=load('t1.txt');
  6. [Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T);
  7. net=newff(minmax(Pn),[5,1],{'tansig','purelin'},'trainlm');
  8. net=init(net);
  9. net.trainParam.epochs=50000; %设置网络训练次数为50000次
  10. net.trainParam.show=50; %设置每隔50次显示当前网络训练误差
  11. net.trainParam.goal=0.0001; %设置网络训练目标误差为0.01
  12. [net,tr]=train(net,Pn,Tn); %利用函数train()对网络进行训练
  13. y=sim(net,Pn); %利用函数sim()对训练年份和检验年份进行仿真
  14. Y=postmnmx(y,min(T),max(T)) %%反归一化
  15. AA=sim(net,PP);  
  16. T1=1:1:20;
  17. figure;
  18. plot(T1,T,'b',T1,Y,'r');
复制代码


我觉得主要原因有:
1: 数据读入不太准确;
2:没有进行归一化处理;
3:初始训练数据较少;
另外一个你再加上去就可以了。
23423.jpg

评分

1

查看全部评分

 楼主| 发表于 2007-7-12 22:55 | 显示全部楼层
原帖由 lxq 于 2007-7-12 11:35 发表
clear
P=load('p0.txt');
T=load('t0.txt');
PP=load('p1.txt')
TT=load('t1.txt');
[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T);
net=newff(minmax(Pn),[5,1],{'tansig','purelin'},'trainlm');
net=ini ...



天啊,lxq的代码和我那最主要的区别就是多了一个归一化和反归一化,怎么最终效果就差这么多

开心!
 楼主| 发表于 2007-7-12 23:13 | 显示全部楼层
可是,为什么训练的20年里,预测的效果是那样好,而预测的4年里,效果那么差呢?
 楼主| 发表于 2007-7-13 22:58 | 显示全部楼层
对20年内的训练效果很好,可是对接下来的4年的预测去怎么差的那么远?

训练效果

训练效果

预测效果

预测效果
 楼主| 发表于 2007-7-13 23:01 | 显示全部楼层
另外,我觉的是不是训练样本太少,我自己又找了另一组数据,训练40年之后,再对10年进行预测,还是出现同样的现像,前40年训练极好,可是后10年预测差的太多太多,是不是我这个程序还有问题?


*********************************************88

clear
P=load('p0.txt');
T=load('t0.txt');
PP=load('p1.txt')
TT=load('t1.txt');
[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T);
net=newff(minmax(Pn),[5,1],{'tansig','purelin'},'trainlm');
net=init(net);
net.trainParam.epochs=50000; %设置网络训练次数为50000次
net.trainParam.show=50; %设置每隔50次显示当前网络训练误差
net.trainParam.goal=0.0001; %设置网络训练目标误差为0.01
[net,tr]=train(net,Pn,Tn); %利用函数train()对网络进行训练
y=sim(net,Pn); %利用函数sim()对训练年份和检验年份进行仿真
Y=postmnmx(y,min(T),max(T)) %%反归一化
AA=sim(net,PP);  
T1=1:1:20;
figure;
plot(T1,T,'b',T1,Y,'r');

figure;

T2=1:1:4;
plot(T2,TT,'b',T2,AA,'r');
发表于 2008-1-7 09:22 | 显示全部楼层
还努力学习中,感谢楼主!:victory:
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-18 10:51 , Processed in 0.072071 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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