📄 ron.m
字号:
clear;
clc;
L=60;%滑动窗口长度
k=1;%重叠系数
epzroumin=0.02;%误差准则
daietamin=0.3;%距离准则
yeta=0.5;%学习系数
apha=0.5;%动量系数
MaxEpoch=100;%最大学习次数
amin=0.01;%激活阀值
Cmax=400;%最大未被激活数
rmin=0.05;%扩展常数最小值
rmax=0.25;%扩展常数最大值
daitaepzroumin=0.0001;%两次梯度修正误差
daitacmin=0.01;%合并阀值
daitarmin=0.01;%合并阀值
dimension=2;%样本输入的维数
kkk=0;%样本
for k=0:0.1:1
for kk=0:0.1:1
kkk=kkk+1;
A{kkk}=[k kk];
end
end%样本
i=1;
p=0;pp=0;ppp=0;
while(i<=kkk)
xn=[A{i}(1) A{i}(2)];%维数改变时需修改
yn=targetfunction(xn);%样本输入
if(i==1)%输入第一样本时,无隐节点
window{1}=[xn yn];
b=yn;
dn=daietamin;
h=0;%隐节点数为0
else
if(i<=L)%更新活动窗口
window{i}=[xn yn];
LL=i;%确定滑动窗口中元素个数
else
for j=1:L-1
window{j}=window{j+1};
end
window{L}=[xn yn];
LL=L;%确定滑动窗口中元素个数
end%更新活动窗口
for i2=1:h%累计各隐节点未被激活次数
for aa=1:dimension
ci2(aa)=c{i2}(aa);
end
sum=0;
for i3=1:LL
for a1=1:dimension%提取滑动窗口中第i3个样本输入
x1(a1)=window{i3}(a1);
end%提取滑动窗口中第i3个样本输入
sum=sum+exp(-(x1-ci2)*(x1-ci2)'/r(i2)^2);
end
sum=sum/LL;
if(sum>amin)
unactivation(i2)=0;
else
unactivation(i2)=unactivation(i2)+1;
end
end%累计各隐节点未被激活次数
i4=1;%删除长期未被激活的隐节点
while(i4<=h)
if(unactivation(i4)>Cmax)
for i5=i4:h-1
c{i5}=c{i5+1};
r(i5)=r(i5+1);
w(i5)=w(i5+1);
unactivation(i5)=unactivation(i5+1);
end
w(h)=0;
r(h)=0;
c{h}=[0 0];
unactivation(h)=0;
h=h-1;
i4=i4-1;
pp=pp+1;
shanchu{pp}=[i,h];
end
i4=i4+1;
end%删除长期未被激活的隐节点
fxn=b;%计算隐节点输出
for ii=1:h
for aa=1:dimension
cii(aa)=c{ii}(aa);
end
faixn=exp(-(xn-cii)*(xn-cii)'/r(ii)^2);
fxn=fxn+w(ii)*faixn;
d(ii)=sqrt((xn-cii)*(xn-cii)');
dn=min(d);
end
en=abs(yn-fxn);%计算隐节点输出
if(dn>=daietamin&&en>epzroumin)%增加一个新隐节点
c{h+1}=xn;
w(h+1)=en;
r(h+1)=k*dn;
unactivation(h+1)=0;
h=h+1;%增加一个新隐节点
p=p+1;
zengjia{p}=[i,h];
else%调节网络参数
for n=2:MaxEpoch%学习MaxEpoch次
for iii=1:h%更新隐节点数据中心和扩展常数
daitac{1,iii}=[0 0];%维数变化时需调整
daitar(1,iii)=0;
fxgradsci=[0 0];%维数变化时需调整
fxgradsri=0;
for aa=1:dimension
ciii(aa)=c{iii}(aa);
end
for jj=1:LL
for aa=1:dimension%提取滑动窗口中第jj个样本输入
x(aa)=window{jj}(aa);
end%提取滑动窗口中第jj个样本输入
baitai=2*jj/(LL*(LL+1));
ei=window{jj}(dimension+1)-b;
for i1=1:h
for aa=1:dimension
ci1(aa)=c{i1}(aa);
end
ei=ei-w(i1)*exp(-(x-ci1)*(x-ci1)'/r(i1)^2);
end
fxgradsci=fxgradsci+baitai*ei*exp(-(x-ciii)*(x-ciii)'/r(iii)^2)*(x-ciii);
fxgradsri=fxgradsri+baitai*ei*exp(-(x-ciii)*(x-ciii)'/r(iii)^2)*(x-ciii)*(x-ciii)';
end
daitac{n,iii}=yeta*2*w(iii)/r(iii)^2*fxgradsci;%待修改
daitar(n,iii)=yeta*2*w(iii)/r(iii)^3*fxgradsri;%待修改
c{iii}=c{iii}+daitac{n,iii}+apha*daitac{n-1,iii};
r(iii)=r(iii)+daitar(n,iii)+apha*daitar(n-1,iii);
if(r(iii)>rmax)%对r进行限幅处理
r(iii)=rmax;
else
if(r(iii)<rmin)
r(iii)=rmin;
end
end%对r进行限幅处理
end%更新隐节点数据中心和扩展常数
m=0;%记录被激活的隐节点
for ii1=1:h
for aa=1:dimension
cii1(aa)=c{ii1}(aa);
end
sum=0;
for i3=1:LL
for a1=1:dimension%提取滑动窗口中第i3个样本输入
x1(a1)=window{i3}(a1);
end%提取滑动窗口中第i3个样本输入
sum=sum+exp(-(x1-cii1)*(x1-cii1)'/r(ii1)^2);
end
sum=sum/LL;
if(sum>amin)
m=m+1;
M(m)=ii1;
end
end%记录被激活的隐节点
for ii2=1:m%M个隐节点输出阵
for aa=1:dimension
cii2(aa)=c{M(ii2)}(aa);
end
for ii3=1:LL
for a1=1:dimension%提取滑动窗口中第i3个样本输入
x1(a1)=window{ii3}(a1);
end%提取滑动窗口中第i3个样本输入
AM(ii2,ii3)=exp(-(x1-cii2)*(x1-cii2)'/r(M(ii2))^2);
y(ii3)=window{ii3}(dimension+1);
end
end%M个隐节点输出
if(m>0)
IL=ones(1,LL);
AM1=[AM;IL];
AM11=inv(AM1*AM1')*AM1;
W=AM11*y';
for iii2=i:m
w(M(iii2))=W(iii2);%更新激活节点权值
end
b=W(m+1);%更新输出偏移量
end
for i11=1:h-1%合并隐节点
i12=i11+1;
while(i12<=h)
if(sqrt((c{i11}-c{i12})*(c{i11}-c{i12})')<daitacmin&&abs(r(i11)-r(i12))<daitarmin)
w(i11)=w(i11)+w(i12);
c{i11}=(c{i11}+c{i12})/2;
r(i11)=(r(i11)+r(i12))/2;
for i13=i12:h-1
w(i13)=w(i13+1);
r(i13)=r(i13+1);
c{i13}=c{i13+1};
unactivation(i13)=unactivation(i13+1);
end
w(h)=0;
r(h)=0;
c{h}=[0 0];
unactivation(h)=0;
h=h-1;
i12=i12-1;
ppp=ppp+1;
hebing{ppp}=[i,h];
end
i12=i12+1;
end
end%合并隐节点
E(1)=0;%计算窗口内样本误差
E(n)=0;
for iii3=1:LL
en=window{iii3}(dimension+1)-b;
for a1=1:dimension%提取滑动窗口中第iii3个样本输入
x1(a1)=window{iii3}(a1);
end%提取滑动窗口中第iii3个样本输入
for iii4=1:h
for aa=1:dimension
ciii4(aa)=c{iii4}(aa);
end
en=en-w(iii4)*exp(-(x1-ciii4)*(x1-ciii4)'/r(iii4)^2);
end
baitai=2*iii3/(LL*(LL+1));
E(n)=E(n)+baitai*en^2;
end%计算窗口内样本误差
if(sqrt(E(n))<epzroumin||abs(sqrt(E(n))-sqrt(E(n-1)))<daitaepzroumin)%误差指标
break;
end%误差指标
end%学习MaxEpoch次
end%网络参数调节结束
end
hh(i)=h;
i=i+1;
end
for ii=1:kkk
for a=1:dimension
x(a)=A{ii}(a);
end
fx=b;
for i=1:h
for aa=1:dimension
ci(aa)=c{i}(aa);
end
fx=w(i)*exp(-(x-ci)*(x-ci)'/r(i)^2);
end
eee(ii)=fx;
ee(ii)=targetfunction(x);
e(ii)=(targetfunction(x)-fx)/targetfunction(x);
end
i=[1:1:121];
subplot(221);
plot(i,e(i),'g*');
subplot(222);
plot(i,ee(i),'r*');
subplot(223);
plot(i,eee(i),'b*');
subplot(224);
plot(i,hh(i),'r*');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -