|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
这是我编的小波神经网络程序,是多入多出的,用于预测,误差怎么都降不下来,有时还是一个固定值,权值和尺度因子,位移都在调,只是很小。参考了“ <青岛海洋大学学报> 2001年第1期 一种基于BP算法学习的小波神经网络”。是不是我编算法时可能什么地方搞错了,请大家帮我看一看啊?谢谢
clc;
clear all;
%设定期望的误差最小值
err_goal=0.001;
%设定最大循环次数
max_epoch=100;
%设定修正权值的学习速率0.01-0.7
%五输入一输出的预测。
T1=[33+5*randn(1,1001)]';
T2=[75+2*randn(1,1001)]';
P1=[150000+10000*randn(1,1001)]';
P2=[250000+10000*randn(1,1001)]';
Q1=[85+20*randn(1,1001)]';
Q2=[42+10*randn(1,1001)]';
P=[T1,T2,P1,P2,Q1,Q2];
t1(:,1)=(T1(:,1)-min(T1(:,1)))/(max(T1(:,1))-min(T1(:,1)));
t2(:,1)=(T2(:,1)-min(T2(:,1)))/(max(T2(:,1))-min(T2(:,1)));
p1(:,1)=(P1(:,1)-min(P1(:,1)))/(max(P1(:,1))-min(P1(:,1)));
p2(:,1)=(P2(:,1)-min(P2(:,1)))/(max(P2(:,1))-min(P2(:,1)));
q1(:,1)=(Q1(:,1)-min(Q1(:,1)))/(max(Q1(:,1))-min(Q1(:,1)));
q2(:,1)=(Q2(:,1)-min(Q2(:,1)))/(max(Q2(:,1))-min(Q2(:,1)));
P=[t1,t2,p1,p2,q1,q2];
XL=P(1:401,:); pt1=XL(1:end-1,1);pt2=XL(1:end-1,3:6);
PT=[pt1,pt2]';%输入时间序列
PT2=XL(:,2);PT2d=[PT2(2:end,:)]';%目标输出序列
lr=0.01;
epoch=0;
M=5;
N=1;%输出节点的个数
n=20;%隐形节点的个数
%输入层到隐含层的权值初始化
Wjk=randn(n,M);
Wij=randn(N,n);
a=20*randn(1,n);
%a=1:1:n;
b=randn(1,n);
%b=1:1:n;
y=zeros(1,N);%输出节点初始化
y=zeros(1,N);%输出节点初始化
net=zeros(1,n);%隐形节点初始化
net_ab=zeros(1,n);%隐形节点初始化
%step2--------对网络进行训练-------------------------------------------
Y=[];
for pt=1:1:400
for i=1:1:N
for j=1:1:n
for k=1:1:M
net(j)=net(j)+Wjk(j,k)*PT(k,pt);
net_ab(j)=(net(j)-b(j))/a(j);
end
y(i)=y(i)+Wij(i,j)*mymorlet(net_ab(j));
%mymorlet是judyever编写的小波函数,以后可以扩展成输入不同的小波名字即可
% y(i)=mysigmoid(2,y(i));
end
end
Y=[Y y];
end
figure
t=1:1:400;
plot(t,PT2d,'r',t,Y);
title('训练前的目标序列和实际输出序列');
d=PT2d;
err=d-Y;
SSE=err*err'/400;
%step3--------调整各个参数-------------------------------------------
while (SSE>err_goal & epoch<max_epoch)
d_Wjk=zeros(n,M);
d_Wij=zeros(N,n);
d_a=zeros(1,n);
d_b=zeros(1,n);
for pt=1:1:400
for i=1:1:N
for j=1:1:n
d_Wij(i,j)=-(d(i)-y(i))*mymorlet(net_ab(j));
%调整d_Wij(i,j)
for k=1:1:M
d_Wjk(j,k)=d_Wjk(j,k)+(d(i)-y(i))*Wij(i,j); %计算还没有结束
d_Wjk(j,k)=-d_Wjk(j,k)*d_mymorlet(net_ab(j))*PT(k,pt)/a(j);%计算结束
end
%调整d_Wjk(j,k)
d_b(j)=d_b(j)+(d(i)-y(i))*Wij(i,j);%计算还没有结束
d_b(j)=d_b(j)*d_mymorlet(net_ab(j))/a(j);%计算结束
%调整d_b(j)
d_a(j)=d_a(j)+(d(i)-y(i))*Wij(i,j);%计算还没有结束
d_a(j)=d_a(j)*d_mymorlet(net_ab(j))*((net(j)-b(j))/b(j))/a(j);%计算结束
%调整d_a(j)
end
end
end
%step4--------网络重新计算-------------------------------------------
Wij=Wij-lr*d_Wij;
Wjk=Wjk-lr*d_Wjk;
b=b-lr*d_b;
a=a-lr*d_a;
d_Wjk,Wjk
%修正各个权值
y1=zeros(1,N);%输出节点初始化
net=zeros(1,n);%隐形节点初始化
net_ab=zeros(1,n);%隐形节点初始化
Y1=[];
for pt=1:1:400
for i=1:1:N
for j=1:1:n
for k=1:1:M
net(j)=net(j)+Wjk(j,k)*PT(k,pt);
net_ab(j)=(net(j)-b(j))/a(j);
end
end
y1(i)=y1(i)+Wij(i,j)*mymorlet(net_ab(j));
%mymorlet是judyever编写的小波函数,以后可以扩展成输入不同的小波名字即可
% y(i)=mysigmoid(2,y(i));
end
Y1=[Y1 y1];
end
epoch=epoch+1;
err=d-Y1;
SSE1=err*err'/400;
[epoch SSE1]
end
%step5--------输出-------------------------------------------
figure
plot(t,d,'r',t,Y1);
title('训练后的目标序列和实际输出序列');
% % 这里面用到的两个子程序分别是:
% function y=mymorlet(t)
% % y = exp(-(t.^2)/2) * cos(1.75*t);
% % %%%%%%%%%%%%%%%%%%%%%%555
% % function y=d_mymorlet(t)
% y = -1.75*sin(1.75*t).*exp(-(t.^2)/2)-t* cos(1.75*t).*exp(-(t.^2)/2) ; |
|