📄 ran.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 + -