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

📄 ran.m

📁 关于资源分配网络源代码。可以动态调节隐层节点个数。不增加节点时采用梯度法调节参数。
💻 M
字号:
clear all;
clc;

TrainSamNum=400; %训练样本数
TestSamNum=201;  %测试样本数
InDim=3;         %样本输入维数
OutDim=1;        %样本输出维数

%根据目标函数得样本输入输出
TrainSamIn=4*rands(1,TrainSamNum);
TrainSamOut=1.1*(1-TrainSamIn+2*TrainSamIn.^2).*exp(-TrainSamIn.^2/2);

TestSamIn=-4:0.04:4;
TestSamOut=1.1*(1-TestSamIn+2*TestSamIn.^2).*exp(-TestSamIn.^2/2);
TestSTD=std(TestSamOut);

overlapcoe=0.87;     %重叠系数
dist_max=2.0;         %最大距离分辨率  
dist_min=0.2;         %最小距离分辨率
errlimit=0.02;        %误差分辨率
decay=0.977;          %分辨率衰减常数
lr=0.05;             %学习率
maxepoch=100;         %最大学习次数
distlimit=dist_max;    %距离分辨率


b2=TrainSamOut(:,1);
w2=[];
unitcenters=[];
spreadconstant=[];
unitnum=0;
allunitnum=0;
alltestrsme=[];
tp=[errlimit lr maxepoch];
 
for trainednum=2:TrainSamNum   % trainednum
 
    newinput=TrainSamIn(:,trainednum);
    newoutput=TrainSamOut(:,trainednum);
 
% 网络输出netout=rbfnn(newinput,unitcenters,w2,b2,spreadconstant);
      [unitnum,OutDim]=size(w2');
      [xxx,innum]=size(newinput);
      if (unitnum==0)
          netout=repmat(b2,1,innum);
      else
          spreadmat=repmat(spreadconstant,1,innum);
          alldist=dist(unitcenters',newinput);
          a1=radbas(alldist./spreadmat);         
          netout=w2*a1+b2;

      end
 %________________        
 

    newerr=newoutput-netout; %误差
    
    
    if (unitnum==0)            %求数据中心
        newdist=dist_max;
    else
       alldist=dist(unitcenters',newinput);
       newdist=min(alldist);
    end
 
if (norm(newerr)>=errlimit & newdist>=distlimit)   %判段是否增加新隐节点
%增加新隐节点
%addnewunit(newinput,newerr,newdist,unitcenters,w2,spreadconstant,overlapcoe);
       
         unitcenters=[unitcenters newinput];
         w2=[w2 newerr];
         spreadconstant=[spreadconstant;overlapcoe*newdist]   
         unitnum=unitnum+1;
          
 else        
  %finetuning(newinput,newoutput,unitcenters,w2,b2,spreadconstant,tp);梯度法调整
  %++++++++++    
       [xxx,unitnum]=size(unitcenters);
    if (unitnum==0),b2=newoutput;return, end
         errlimit=tp(1);
         lr=tp(2);
         maxepoch=tp(3);
    for epoch=1:maxepoch
        alldist=dist(unitcenters',newinput);
        spreadmat=repmat(spreadconstant,1,innum);
        a1=radbas(alldist./spreadmat);
        netout=w2*a1+b2;
        newerr=newoutput-netout;
    
        if (norm(newerr)<errlimit),break,end
        b2=b2+lr*newerr;
        for i=1:unitnum
           
            unitcenters(:,i)=unitcenters(:,i)+lr*2*(newinput-unitcenters(:,i))*a1(i)*newerr*w2(i)/(spreadconstant(i)^2);
            spreadconstant=spreadconstant+lr*alldist(i,:).^2*(a1(i)*newerr*w2(i)/(spreadconstant(i)^3));
            w2=w2+lr*newerr*a1(i,:)';
        end
 
    end
    %++++++++++++++   
 
end

  if distlimit>dist_min         %分辨率衰减
      distlimit=distlimit*decay;
  else
      distlimit=dist_min;
  end
     
 allunitnum=[allunitnum unitnum];
 
    
 
 
 % testnnout=rbfnn(TestSamIn,unitcenters,w2,b2,spreadconstant);测试网络输出
      [unitnum,OutDim]=size(w2');
      [xxx,innum]=size(TestSamIn);
      if (unitnum==0)
          testnnout=repmat(b2,1,innum);
      else
          spreadmat=repmat(spreadconstant,1,innum);
          alldist=dist(unitcenters',TestSamIn);
          a1=radbas(alldist./spreadmat);
          testnnout=w2*a1+b2;
      end                  
         testrsme=sqrt(sumsqr(testnnout-TestSamOut)/TestSamNum)/TestSTD;%归一化RSME
         alltestrsme=[alltestrsme testrsme]; 
 
end

%********     
  

 
 %   **********测试用 
 %testnnout=rbfnn(TestSamIn,unitcenters,w2,b2,spreadconstant);
  [unitnum,OutDim]=size(w2');
      [xxx,innum]=size(TestSamIn);
      
          spreadmat=repmat(spreadconstant,1,innum);
          testalldist=dist(unitcenters',TestSamIn);
          testa1=radbas(testalldist./spreadmat);
          testnnout=w2*testa1+b2;
      [xxx,ptnum]=size(TestSamOut);
      

 %绘制目标曲线和神经网络输出曲线 
  figure
 echo off
 axis([0 ptnum -0.2 3.0])
 axis on
 grid
 hold on
 plot(1:ptnum,TestSamOut,'b-')
  plot(1:ptnum,testnnout,'r-')
  unitnum
  testrsme

 %绘制隐节点变化曲线
[xxx,ptnum]=size(allunitnum);
 figure
 echo off
 axis([0 ptnum 0 40])
 axis on
 grid
 hold on
 plot(1:ptnum,allunitnum,'b-')

%**********************************  
 
%绘制RSME曲线

[xxx,ptnum]=size(alltestrsme);
 figure
 echo off
 axis on
 grid
 hold on
 plot(1:ptnum,alltestrsme,'g-')

%**************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -