?? wavelet.m
字號:
%參考 <青島海洋大學(xué)學(xué)報> 2001年第1期 一種基于BP算法學(xué)習(xí)的小波神經(jīng)網(wǎng)絡(luò)%%
%step1--------網(wǎng)絡(luò)初始化-------------------------------------------
clc;
clear all;
%設(shè)定期望的誤差最小值
err_goal=0.001;
%設(shè)定最大循環(huán)次數(shù)
max_epoch=50;
%設(shè)定修正權(quán)值的學(xué)習(xí)速率0.01-0.7
lr=0.7;
epoch=0;
x=0:0.01:0.3;%輸入時間序列
d=sin(8*pi*x)+sin(16*pi*x);%目標輸出序列
M=size(x,2);%輸入節(jié)點的個數(shù)
N=M;%輸出節(jié)點的個數(shù)
n=10;%隱形節(jié)點的個數(shù)
%這個地方需要改進,由于實際上隱形節(jié)點的個數(shù)可以通過小波的時頻分析確定
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);%輸出節(jié)點初始化
y=zeros(1,N);%輸出節(jié)點初始化
net=zeros(1,n);%隱形節(jié)點初始化
net_ab=zeros(1,n);%隱形節(jié)點初始化
%step2--------對網(wǎng)絡(luò)進行訓(xù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編寫的小波函數(shù),以后可以擴展成輸入不同的小波名字即可
% y(i)=mysigmoid(2,y(i));
end
end
% plot(x,d,'r',x,y);
% title('訓(xùn)練前的目標序列和實際輸出序列');
err=d-y;
SSE=err*err';
%step3--------調(diào)整各個參數(shù)-------------------------------------------
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 i=1:1:N
for j=1:1:n
d_Wij(i,j)=-(d(i)-y(i))*mymorlet(net_ab(j));
%調(diào)整d_Wij(i,j)
for k=1:1:M
d_Wjk(j,k)=d_Wjk(j,k)+ (d(i)-y(i)) * Wij(i,j) ;%計算還沒有結(jié)束
d_Wjk(j,k)=-d_Wjk(j,k)*d_mymorlet(net_ab(j))*x(k)/a(j);%計算結(jié)束
end
%調(diào)整d_Wjk(j,k)
d_b(j)=d_b(j)+(d(i)-y(i))*Wij(i,j);%計算還沒有結(jié)束
d_b(j)=d_b(j)*d_mymorlet(net_ab(j))/a(j);%計算結(jié)束
%調(diào)整d_b(j)
d_a(j)=d_a(j)+(d(i)-y(i))*Wij(i,j);%計算還沒有結(jié)束
d_a(j)=d_a(j)*d_mymorlet(net_ab(j))*((net(j)-b(j))/b(j))/a(j);%計算結(jié)束
%調(diào)整d_a(j)
end
end
%step4--------網(wǎng)絡(luò)重新計算-------------------------------------------
Wij=Wij-lr*d_Wij;
Wjk=Wjk-lr*d_Wjk;
b=b-lr*d_b;
a=a-lr*d_a;
%修正各個權(quán)值
y=zeros(1,N);%輸出節(jié)點初始化
net=zeros(1,n);%隱形節(jié)點初始化
net_ab=zeros(1,n);%隱形節(jié)點初始化
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編寫的小波函數(shù),以后可以擴展成輸入不同的小波名字即可
% 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('訓(xùn)練后的目標序列和實際輸出序列');
% 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);
%這里面用到的兩個子程序分別是:
% 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) ;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -