- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 1957 个
- 通用积分
- 0.0600
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 971 点
- 帖子
- 68
- 精华
- 0
- 在线时间
- 85 小时
- 注册时间
- 2009-9-24
- 最后登录
- 2013-8-17
本科生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
- 1957 个
- 通用积分
- 0.0600
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 971 点
- 帖子
- 68
- 精华
- 0
- 在线时间
- 85 小时
- 注册时间
- 2009-9-24
- 最后登录
- 2013-8-17
|
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('流量水位图(实际与仿真值比较)') |
|