📄 ran.m
字号:
% rbf在线学习实现函数逼近
% 资源分配网络实现动态分配节点
% 2008-6-27
function ran()
TrainSamNum=3000; %训练样本数
TestSamNum=500; %测试样本数
InDim=4; %输入维数
OutDim=1; %输出唯数
a=zeros(1,5586);
a(1)=1.2;
for i=2:17
a(i)=a(i-1)/1.1;
end
for i=18:5586
a(i)=(0.2*a(i-17)/(1+(a(i-17))^10)+a(i-1))/1.1;
end
TrainSamIn=zeros(4,3000);
TrainSamOut=zeros(1,3000);
TestSamIn=zeros(4,500);
TestSamOut=zeros(1,500);
m=randperm(TrainSamNum);
TrainSamIn(1,m)=a(m+201-18);
TrainSamIn(2,m)=a(m+201-12);
TrainSamIn(3,m)=a(m+201-6);
TrainSamIn(4,m)=a(m+201);
TrainSamOut(1,m)=a(m+201+85);
for i=5002:5501
TestSamIn(1,i-5001)=a(i-18);
TestSamIn(2,i-5001)=a(i-12);
TestSamIn(3,i-5001)=a(i-6);
TestSamIn(4,i-5001)=a(i);
TestSamOut(1,i-5001)=a(i+85);
end
OverLapCoe=0.75;
DistMax=0.6;
DistMin=0.02;
ErrLimit=0.01;
DecayCoe=0.95;
lr=0.01;
MaxEpoch=900;
DistLimit=DistMax;
b2=TrainSamOut(:,1);
w2=[];
UnitCenters=[];
SpreadConstant=[];
UnitNum=0;
AllUnitNum=0;
AllTestRSME=[];
for TrainNum=2:TrainSamNum
NewInput=TrainSamIn(:,TrainNum);
NewOutput=TrainSamOut(:,TrainNum);
NetOut=RBFNNN(NewInput,UnitCenters,w2,b2,SpreadConstant);
NewErr=NewOutput-NetOut;
if UnitNum==0
NewDist=DistMax;
else
AllDist=dist(UnitCenters',NewInput);
NewDist=min(AllDist);
end
if norm(NewErr)>=ErrLimit & NewDist>=DistLimit
UnitCenters=[UnitCenters NewInput];
w2=[w2 NewErr];
SpreadConstant=[SpreadConstant;OverLapCoe*NewDist];
UnitNum=UnitNum+1;
else
[xxx,UnitNum]=size(UnitCenters);
if UnitNum==0
b2=NewOutput;
else
for epoch=1:MaxEpoch
AllDist=dist(UnitCenters',NewInput);
a1=radbas(AllDist./SpreadConstant);
NewDist=min(AllDist);
NetOut=w2*a1+b2;
NewErr=NewOutput-NetOut;
if norm(NewErr)<ErrLimit
break
end
b2=b2+lr*NewErr;
w2=w2+lr*NewErr*a1';
for i=1:UnitNum
DeltaCenter=2*(NewInput-UnitCenters(:,i))*a1(i)*NewErr*w2(i)/(SpreadConstant(i)^2);
UnitCenters(:,i)=UnitCenters(:,i)+lr*DeltaCenter;
end
end
end
end
if DistLimit>DistMin
DistLimit=DistLimit*DecayCoe;
else
DistLimit=DistMin;
end
AllUnitNum=[AllUnitNum UnitNum];
TestNNOut=RBFNNN(TestSamIn,UnitCenters,w2,b2,SpreadConstant);
TestRSME=sqrt(sumsqr(TestNNOut-TestSamOut)/TestSamNum);
AllTestRSME=[AllTestRSME TestRSME];
end
% 预测输出与实际输出比较
figure
TargetInOut=a(5087:5586);
plot(1:500,TargetInOut,'b-',1:500,TestNNOut,'r+')
legend('折线样本输出','神经网络拟合输出')
% 画出隐节点的变化曲线
[xxx,InputNum]=size(AllUnitNum);
figure
plot(1:InputNum,AllUnitNum);
xlabel('训练样本个数')
ylabel('隐节点个数')
title('隐节点随训练次数的增加')
%画出 RSME 的变化曲线
[xxx,InputNum]=size(AllTestRSME);
figure
plot(1:InputNum,AllTestRSME);
xlabel('训练样本个数')
ylabel('RSME 值')
title('RSME随训练次数的变化')
% 建立rbf网,根据数据中心,输出权值,扩展常数计算输出
function NetOut=RBFNNN(NewInput,UnitCenters,w2,b2,SpreadConstant)
[UnitNum,OutDim]=size(w2);
[xxx,InNum]=size(NewInput);
[xxx1,CenterNum]=size(UnitCenters);
if UnitNum==0
NetOut=repmat(b2,1,InNum); % look again
else
SpreadMat=repmat(SpreadConstant,1,InNum);
%新增点到各个数据中心的距离
AllDist=dist(UnitCenters',NewInput);
a1=radbas(AllDist./SpreadMat);
NetOut=w2*a1+b2;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -