径向基神经网络及MATLAB实现

应用背景:我们知道,在使用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.-')


运行结果如下图


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值