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