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