应用背景:我们知道,在使用BP神经网络时,由于其采用负梯度下降法对权值进行调节而具有收敛速度慢和容易陷入局部最小值等缺点,为了克服这些缺点,人们提出了径向基神经网络(Radial Basis Function Neural Network)。
基本原理:径向基神经网络由三层构成,即输入层、隐含层、输出层。如下图所示
其中,输入层到隐含层为径向基部分,非线性,输入层节点到隐含层节点之间没有权值,隐含层节点的激活函数为径向基函数(Radial Basis Function ),函数图像是径向对称的,如高斯函数。这也是把该网络结果称为径向基神经网络的由来,隐含层节点输出如下式所示
其中,ui为隐含层第i个节点输出,σ为高斯函数的标准差,ci为均值,也即隐含层第i个节点激活函数的中心向量;隐含层到输出层为线性部分,实现隐含层节点输出到输出层节点输出的线性映射,如下式
其中,ui为隐含层第i个节点输出,yk为输出层第k个节点输出,wki为隐含层第i个节点到输出层第k个节点的权值系数,θk为输出层的阈值,q为隐含层节点数。
一般来说,要得到一个较好的径向基神经网络模型,需要解决2个问题,一是结构问题即隐含层节点数量;二是参数计算,包括径向基函数的中心、方差以及隐含层节点到输出层节点的权值。对第一个问题,隐含层节点数量根据具体问题而定,通常少于训练样本数目;对第二个问题,一般分为二个过程,即非监督学习过程用来求解隐含层激活函数的中心与方差与监督学习过程用来求解隐含层到输出层之间的权值。
在非监督学习过程中,基函数中心的求解方法有随机选取、自组织选取、有监督选取、正交最小二乘法选取等方法。求解方差的方法有很多,例如下式所示求解方差:
其中,Cmax为求得的中心之间的最大距离,h为隐含层节点数目。
使用径向基神经网络逼近函数的实例matlab代码如下:
P=201;
X=[];
Y=[];
M=10;
centers=[];
deltas=[];
weights=[];
set = {};
gap=0.1;
%**************************************************************************
%构造训练样本X,Y
X=[-4:0.04:4];
for i=1:P
Y(i)=1.1*(1-X(i)+2*X(i)^2)*exp(-X(i)^2/2); %要逼近的函数f(x)=1.1*(1-x+2*x^2)*exp(-x^2/2)
end
Y=Y+0.1*randn(1,P); %添加噪声
%**************************************************************************
for i=1:M
centers(i)= X( i*floor( P/10 ) );
end
done=0;
while(~done)
for i=1:M
set{i}=[];
end
for i=1:P
distance=100;
for j=1:M
curr=abs(X(i)-centers(j));
if curr<distance
sets=j;
distance=curr;
end
end
set{sets}=[set{sets},X(i)];
end
for i=1:M
new_centers(i)=sum(set{i})/length(set{i});
end
done=0;
for i=1:M
sum1(i)=abs(centers(i)-new_centers(i));
end
if sum(sum1)>gap
done=0;
centers=new_centers;
else
done=1;
end
end
for i=1:M
curr=abs( centers-centers(i) );
[curr_2,b]=min(curr);
curr(b)=100;
curr_2=min(curr);
deltas(i)=1*curr_2;
end
for i=1:P
for j=1:M
curr=abs(X(i)-centers(j));
K(i,j)=exp( -curr^2/(2*deltas(j)^2) ); %隐含层的输出
end
end
%计算权值矩阵
weights=inv(K'*K)*K'*Y';
%**************************************************************************
%测试计算出函数的情况
x_test=[-4:0.1:4];
for i=1:length(x_test)
sum=0;
for j=1:M
curr=weights(j)*exp(-abs(x_test(i)-centers(j))^2/(2*deltas(j)^2));
sum=sum+curr;
end
y_test(i)=sum;
end
figure(1)
scatter(X,Y,'k+');
hold on;
plot(x_test,y_test,'r.-')
运行结果如下图