小波神经网络预测的代码1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clc;
clear all;
%设定期望的误差最小值
err_goal=0.01;
%设定最大循环次数
max_epoch=50;
%设定修正权值的学习速率0.01-0.7
lr=0.7;
epoch=0;
x=0:0.01:0.3;%输入时间序列
%d=sin(8*pi*x)+sin(4*pi*x)+5*sin(pi*x);%
d=[1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 9 8 7];%目标输出序列M=size(x,2);%输入节点的个数
N=M;%输出节点的个数
n=10;%隐形节点的个数
%这个地方需要改进,由于实际上隐形节点的个数可以通过小波的时频分析确定
Wjk=randn(n,M);
Wij=randn(N,n);
% a=randn(1,n);
a=1:1:n;
b=randn(1,n);
% stepa=0.2*(x(M)-x(1));
% a=stepa:1n-1)+stepa;
% step=(x(M)-x(1))/n;
% b=x(1)+step:step:x(1)+n*step;
% y=zeros(1,N);%输出节点初始化
y=zeros(1,N);%输出节点初始化
net=zeros(1,n);%隐形节点初始化
net_ab=zeros(1,n);%隐形节点初始化
%step2--------对网络进行训练-------------------------------------------
for i=1:1:N
for j=1:1:n
for k=1:1:M
net(j)=net(j)+Wjk(j,k)*x(k);
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
% plot(x,d,'r',x,y);
% title('训练前的目标序列和实际输出序列');
err=d-y;
SSE=err*err';
%step3--------调整各个参数-------------------------------------------
while (SSE>err_goal & epoch d_Wjk=zeros(n,M); d_Wij=zeros(N,n); d_a=zeros(1,n); d_b=zeros(1,n); 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))*x(k)/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 %step4--------网络重新计算------------------------------------------- Wij=Wij-lr*d_Wij; Wjk=Wjk-lr*d_Wjk; b=b-lr*d_b; a=a-lr*d_a; %修正各个权值 y=zeros(1,N);%输出节点初始化 net=zeros(1,n);%隐形节点初始化 net_ab=zeros(1,n);%隐形节点初始化 for i=1:1:N for j=1:1:n for k=1:1:M net(j)=net(j)+Wjk(j,k)*x(k); 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 epoch=epoch+1; err=d-y; SSE=err*err'/M; [ epoch SSE] end %step5--------输出------------------------------------------- plot(x,d,'r',x,y,':'); title('训练后的目标序列和实际输出序列'); % gtext({'This is the first line','This is the second line'}) % gtext({'First line','Second line'},'FontName','Times','Fontsize',12) legend('target output','WNN output',1);