⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waveletnet3.m

📁 一个小波网络的源程序
💻 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 + -