全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 MATLAB等数学软件专版
1334 3
2009-11-27
悬赏 2 个论坛币 未解决
MATLAB中利用BP工具箱进行预测,对原始样本集进行测试误差很小,而对从原始样本中抽取的小样本测试误差很大,程序如下:
data=xlsread('55-90',-1)';%'55-90'为excle文件名,7列365行;
f=xlsread('55-90',-1)';%还是导入excle文件,1列365行;
d1=[data(1,:)];
d2=[data(2,:)];
d3=[data(3,:)];
d4=[data(4,:)];
d5=[data(5,:)];
d6=[data(6,:)];
d7=[data(7,:)];
d=[d1;d2;d3;d4;d5;d6;d7];
p=[(d1-mean(d1))./std(d1);(d2-mean(d2))./std(d2);(d3-mean(d3))./std(d3);(d4-mean(d4))./std(d4);(d5-mean(d5))./std(d5);(d6-mean(d6))./std(d6);(d7-mean(d7))./std(d7)];
t=(f- mean(f))./std(f);
P_train=[p(:,1:300)];
T_train=[t(:,1:300)];
P_test=[p(:,301:365)];
T_test=[t(:,301:365)];
s=7:15
res=zeros(size(s));
for i=1:length(s)           
    net=newff(minmax(p),[s(i),1],{'tansig','logsig'},'trainlm');
    net.iw{1,1}=zeros(size(net.iw{1,1}))+0.5;
    net.lw{2,1}=zeros(size(net.lw{2,1}))+0.75;
    net.b{1,1}=zeros(size(net.b{1,1}))+0.5;
    net.b{2,1}=zeros(size(net.b{2,1}));
    net.trainParam.epochs=5000;
    net.trainParam.goal =1e-7;
    net=train(net,P_train,T_train);
    y=sim(net,P_test);
    error=(y.*std(f(:,301:365))+mean(f(:,301:365))-f(:,301:365))./f(:,301:365);
    res(i)=norm(error);
   
end

number=find(res==min(res));%number为使得误差最小的隐层神经元个数
if(length(number)>1) no=number(1)+6;
else no=number+6;
end
clear error,res
%选定隐层神经元数目后,建立网络,训练仿真。
net=newff(minmax(p),[no,1],{'tansig','logsig'},'trainlm');
    net.iw{1,1}=zeros(size(net.iw{1,1}))+0.5;
    net.lw{2,1}=zeros(size(net.lw{2,1}))+0.75;
    net.b{1,1}=zeros(size(net.b{1,1}))+0.5;
    net.b{2,1}=zeros(size(net.b{2,1}));
    net.trainParam.epochs=5000;
    net.trainParam.goal =1e-7;
net=train(net,p,t);
y=sim(net,p);
error=(y.*std(f)+mean(f)-f)./f;%error为网络的误差向量
r=norm(error);%r为网络的整体误差
save net                      %保存最好的网络
%输入测试数据
data2=xlsread('55-90',-1)';
dd1=[data2(1,:)];
dd2=[data2(2,:)];
dd3=[data2(3,:)];
dd4=[data2(4,:)];
dd5=[data2(5,:)];
dd6=[data2(6,:)];
dd7=[data2(7,:)];
p=[dd1;dd2;dd3;dd4;dd5;dd6;dd7];
f2=[data2(8,:)];
p_test2=[(dd1-mean(dd1))./std(dd1);(dd2-mean(dd2))./std(dd2);(dd3-mean(dd3))./std(dd3);(dd4-mean(dd4))./std(dd4);(dd5-mean(dd5))./std(dd5);(dd6-mean(dd6))./std(dd6);(dd7-mean(dd7))./std(dd7)];

y2=sim(net,p_test2);
error=(y2.*std(f2)+mean(f2)-f2)./f2;%error为网络的误差向量
r=norm(error);%r为网络的整体误差
fy=y2.*std(f2)+mean(f2);
%下面是图像显示与结果输出
plot(data2,f2,'rx-',data2,fy,'go:')%绘制投资总量与实际产值,投资总量与仿真的产值图像,
                            %红色表示实际图像,绿色表示仿真图像
xlabel('流量')
ylabel('实际星子水位与仿真星子水位')
title('流量水位图(实际与仿真值比较)')
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-12-16 16:37:00
不是MATLAB程序的问题,是BP的问题,样本内过度训练造成过度拟合,因此样本内误差小,而样本外误差大
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-3-4 16:38:52
请问高手这种情况如何处理啊?跪谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-3-5 09:36:33
用SVM或者LS-SVM可减少样本训练过度的情况
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群