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

📄 ran_rbf.m

📁 这是RBF资源分配神经网络的MATLAB代码,希望对大家有用!
💻 M
字号:
TrainSamNum=400; %训练样本数
TestSamNum=201;  %测试样本数
InDim=1;         %样本输入维数
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);
          al=radbas(alldist./spreadmat);
          netout=w2*al+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)   %判段是否增加新隐节点
      
                                                                              %增加新隐节点
       % [unitcenters,w2,spreadconstant]
       %addnewunit(newinput,newerr,newdist,unitcenters,w2,spreadconstant,overlapcoe);
       
       unitcenters=[unitcenters newinput];
         w2=[w2 newerr];
         spreadconstant=[spreadconstant;overlapcoe*newdist];
         
       
          unitnum=unitnum+1;
          
    else
                                                                            %梯度法调整参数  
          
          %  [unitcenters,w2,b2,spreadconstant]
      %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);
    al=radbas(alldist./spreadmat);
    netout=w2*al+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))*al(i)*newerr*w2(i)/(spreadconstant(i)^2);
             
           
            spreadconstant=spreadconstant+lr*alldist(i,:).^2*(al(i)*newerr*w2(i)/(spreadconstant(i)^3));
            w2=w2+lr*newerr*al(i,:)';
    end
end

     
end

  if distlimit>dist_min         %分辨率衰减
      distlimit=distlimit*decay;
  else
      distlimit=dist_min;
  end
  
  
  
 allunitnum=[allunitnum unitnum];
  
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);
          testal=radbas(testalldist./spreadmat);
          testnnout=w2*testal+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-')




%绘制目标曲线和神经网络输出曲线
 %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);
          al=radbas(alldist./spreadmat);
          testnnout=w2*al+b2;
      end



      
      [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
  
 
%绘制RSME曲线

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


 
 
 
 %********
     [unitnum,OutDim]=size(w2');
      [xxx,innum]=size(testnewinput);
     
     spreadmat=repmat(spreadconstant,1,innum);
     
     for i=1:201
   
    testnewinput=TestSamIn(:,i);
    testnewoutput=TestSamOut(:,i);
    
    % netout=rbfnn(newinput,unitcenters,w2,b2,spreadconstant);
       
          
          
          testnnout(i)=w2*radbas(dist(unitcenters',testnewinput)./spreadmat)+b2;
  
        %  testrsme=sqrt(sumsqr(testnnout-TestSamOut)/TestSamNum)/TestSTD;
         %  alltestrsme=[alltestrsme testrsme];
     end 


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

%  ******** 梯度法调整用
     [xxx,unitnum]=size(unitcenters);
         if (unitnum==0),b2=newoutput;return, end
         errlimit=tp(1);
         lr=tp(2);
         maxepoch=tp(3);
        
      for epoch=1:maxepoch
           % epoch
           
            alldist=dist(unitcenters',newinput);
            newdist=min(alldist);
            al=radbas(alldist./spreadconstant);
            netout=w2*al+b2;
            neweerr=newoutput-netout;
            
            if (norm(newerr)<errlimit),break,end
            
            b2=b2+lr*newerr;
            w2=w2+lr*newerr*al';
            
            for i=1:unitnum
             
                unitcenters(:,i)=unitcenters(:,i)+lr*2*(newinput-unitcenters(:,i))*al(i)*newerr*w2(i)/(spreadconstant(i)^2);
             end
         end
          
          
%**************

⌨️ 快捷键说明

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