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

📄 ran.m

📁 神经网络matlab源程序
💻 M
字号:
function [ output_args ] = Untitled1( input_args )%UNTITLED1 Summary of this function goes here%  Detailed explanation goes hereTrainSamNum=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,:)';    endend     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 + -