📄 waveletnet3.m
字号:
clc;
clear all;
%设定期望的误差最小值
err_goal=0.0001;
%设定最大循环次数
max_epoch=500;
%设定修正权值的学习速率0.01-0.7
lr=0.7;
epoch=0;
x=[1426.1 108.9 0.7 1350.0;
83.9 12.7 2.5 2.6;
11.5 2.5 0.3 0.5;
353.8 66.2 3.5 10.0;
630.0 231.8 0.8 60.0;
44.7 9.1 1.0 3.8;
623.7 30.7 2.5 25.0;
1285.5 210.9 3.0 75.0;
215.4 58.9 1.0 65.0;
215.4 58.9 1.0 65.0;
902.7 90.7 3.0 37.0;
4600.9 294.8 8.0 1000;
446.8 59.9 5.0 76.0;
63.5 5.9 1.6 5.0];
target=[1.9330 0.1039 0.0503 0.8632 1.1668 0.1496 0.7952 1.0599 0.1554 0.3596 3.1805 3.3653 1.2326 1.1975];
M=size(x,2);%输入节点的个数
P=size(x,1);%样本个数
N=length(target);%输出节点的个数
n=10;%隐形节点的个数
Err_NetOut=[]; %保存误差
%数据初始化
for i=1:M
x(:,i)=(x(:,i)-min(x(:,i)))/(max(x(:,i))-min(x(:,i)));
end
d=(target-min(target))/(max(target)-min(target));
%这个地方需要改进,由于实际上隐形节点的个数可以通过小波的时频分析确定
Wjk=randn(n,M);
Wij=randn(N,n);
a=randn(1,n);
b=randn(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)*fai(net_ab(j));
%mymorlet是judyever编写的小波函数,以后可以扩展成输入不同的小波名字即可
% y(i)=mysigmoid(2,y(i));
end
end
%计算误差
err=d-y;
SSE=err*err';
%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 i=1:1:N
for j=1:1:n
d_Wij(i,j)=-(d(i)-y(i))*fai(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)*diffai(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)*diffai(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)*diffai(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,P);%输出节点初始化
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)*fai(net_ab(j));
%mymorlet是judyever编写的小波函数,以后可以扩展成输入不同的小波名字即可
% y(i)=mysigmoid(2,y(i));
end
end
epoch=epoch+1;
err=d-y;
SSE=err*err'/M;
Err_NetOut=[epoch SSE];%保存每次的误差;
[ epoch SSE];
end
%step5--------输出-------------------------------------------
plot(Err_NetOut);
title('误差曲线');
disp('目标达到');
id=1:N
plot(id,d,'r');
hold
plot(id,y,':')
title('训练后的目标序列和实际输出序列');
legend('target output','WNN output',1);
d
y
Y=y*(max(target)-min(target))+min(target)
%step6-------预测---------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -