径向基函数(RBF)神经网络分析

概述

径向基函数神经网络的基本原理,就是将样本对中输入变量和输出变量间的关系解析成多个径向基函数的总和。以二维输入样本X,一维输出样本Y为例,中心点为三个:

输入层
距离计算
基函数值计算
输出层计算
X1
Dist1=//X1-Center1//
Dist2=//X1-Center2//
Dist3=//X1-Center3//
a1=k1*exp<-Dist1^2>*b1
a2=k2*exp<-Dist2^2>*b2
a3=k3*exp<-Dist3^2>*b3
Z1=a1+a2+a3

        符号说明:Center是中心点矩阵,k是权值矩阵,b是阀值矩阵。
上述图中,当样本输出值Y和训练值Z之间接近并且达到预期精度时,就可以认为结果正确,训练结束。该算法通过训练后,需要输出就是上述三个矩阵:中心点矩阵、权值矩阵、阀值矩阵。

流程图

要求出上述三个矩阵,可分为寻找中心点、求阀值、求权值三步,流程如下:

开始
从样本中随机初始化中心点
样本按最近中心点分组
计算每组样本几何中心点
对应中心点和几何中心点距离之和小于设定值
更新中心点
计算各中心点到其余中心点最小距离delta<阀值矩阵b>
计算隐含层矩阵K
计算权值矩阵weights
输出

代码实现

function [deltas,weights,centers]=MyRBF(MatrixX,MatrixY,M)
C1=size(MatrixX);
P=C1(1);
Q=C1(2);
%% 初始化M个中心点
centers=zeros(M,Q);
for i=1:M                          %先随意初始化M个中心点
    centers(i,:)= MatrixX( i*floor( P/M ),: ); 
end 

%% 自组织学习选取RBF中心点
deltas=[];
set = {};%%按中心点分类的样本集
done=0; %%终止条件
gap=0.1;%%阈值
while(~done) 
    for i=1:M 
       set{i}=[]; %%中心点i周围的样本集
    end 
    for i=1:P 
        distance=10000;%%一个很大的数,用于求极小值
        for j=1:M 
            matrixa=MatrixX(i,:)-centers(j,:);
            tempDist=sqrt(matrixa*matrixa');
            if tempDist<distance 
                nearestCenter=j; %%寻找最近的中心点
                distance=tempDist; 
            end 
        end 
        set{nearestCenter}=[set{nearestCenter};MatrixX(i,:)];        %聚类,找出M个中心点中最近点,并且将目标样本分布在这个点样本集中
    end
    new_centers=zeros(M,Q);%% 更新后的中心点
    dist=zeros(1,M);%% 新旧中心点之间距离
    for i=1:M 
        matrix=set{i};
        sizeMatrix=size(matrix);
        for j=1:sizeMatrix(1)
            new_centers(i,:)=new_centers(i,:)+matrix(j,:);
        end
        new_centers(i,:)=new_centers(i,:)/sizeMatrix(1); %重新计算中心点:M个类里每个类的中心点 
    end 
    for i=1:M 
        matrixa=centers(i,:)-new_centers(i,:);
        dist(i)=sqrt(matrixa*matrixa');
    end 
    if sum(dist)>gap %%距离总和是否超过阈值?
        done=0;      %不断循环,直到找到最佳的中心点;
        centers=new_centers; 
    else 
        done=1; %%终止循环
    end    
end

%% 计算阈值矩阵deta
for i=1:M
    tempmatrix=zeros(M,Q);
    tempDist=zeros(M,1);
    for j=1:M
        tempmatrix(j,:)=centers(j,:)-centers(i,:);
        tempDist(j)=sqrt(tempmatrix(j,:)*tempmatrix(j,:)'); 
    end
    [curr_2,b]=min(tempDist); 
    tempDist(b)=10000; 
    curr_2=min(tempDist); 
    deltas(i)=1*curr_2; %%  min(||Ci-Cj||)
end
K=zeros(P,M);
for i=1:P 
    for j=1:M 
        tempDist=(MatrixX(i,:)-centers(j,:))*(MatrixX(i,:)-centers(j,:))'; 
        K(i,j)=exp( -tempDist/(2*deltas(j)^2) );  %隐含层的输出
    end 
end 
%% 计算权值矩阵 
weights=inv(K'*K)*K'*MatrixY; 

将上面的代码保存成m文件MyRBF.m。

案例结果

案例一:聚类
输入1000个样本对。输入样本对(X,Y)中,X为 x∈[-3,3],y∈[-3,3]范围内的随机点位;Y为0或者1,当X在(x-1)(x-1) +y^2 <=2或者(x+1)(x+1)+y^2<=2范围内时,Y=1;其余情况为下Y=0。
测试样本对也是相同范围内的1000个随机点,训练值更接近0时,用‘.’标记;训练值接近1时,用‘’标记。
预期结果:在范围内的点全部标记为“
”,范围外的全部标记为‘.’。
通过一段测试代码调用上面写好的函数

%% 数据准备,100个样本对,30个测试对
P=1000;
Q=2;
MatrixX=6*rand(P,Q)-3*ones(P,Q);%%输入值
MatrixY=zeros(P,1);%%输出值
TestMatrixY=zeros(100,1);%%输出值
for i=1:1000
    Circle1=(MatrixX(i,1)-1)^2+MatrixX(i,2)^2;
    Circle2=(MatrixX(i,1)+1)^2+MatrixX(i,2)^2;
    if(Circle1<2||Circle2<2)
        MatrixY(i)=1;
    end
end

%% 训练
M=200;%%中心点数
[deltas,weights,centers]=MyRBF(MatrixX,MatrixY,M);

%%  结果测试
sitas=0:0.01*pi:2*pi;
Xzixs=sqrt(2)*cos(sitas)-ones(1,201);
Yzixs=sqrt(2)*sin(sitas);
plot(Xzixs,Yzixs,'-');%%画1#圆
hold on;
Xzixs=sqrt(2)*cos(sitas)+ones(1,201);
Yzixs=sqrt(2)*sin(sitas);
plot(Xzixs,Yzixs,'-');%%画2#圆

TestX=6*rand(1000,2)-3*ones(1000,2);%%输入值
TestY=zeros(1000,1);%%输出值
for i=1:1000
    sum1=0; 
    for j=1:M 
        tempDist=weights(j)*exp(-norm(TestX(i,:)-centers(j,:))^2/(2*deltas(j)^2)); 
        sum1=sum1+tempDist; 
    end 
    TestY(i)=sum1; 
end 
for i=1:1000
    if(TestY(i)>0.5)
        plot(TestX(i,1),TestX(i,2),'r*');
        hold on;
    else
        plot(TestX(i,1),TestX(i,2),'r.');
        hold on;
    end
end

运行结果如下:
在这里插入图片描述
由上图可知,正确率99%以上。

案例二:回归
输入1000个样本对。输入样本对(X,Y)中,X为 x∈[-3,3],y∈[-3,3]范围内的随机点位;Y=xx +yy;
测试样本对也是相同范围内的1000个随机点,训练值为Z。Z<2时,用红色标记;Z<4时,用蓝色标记;Z<6时,用黄色标记;Z<8时,用绿色标记;其余用黑色标记。
预期结果:在范围内的点各种颜色呈环形分布。
通过一段测试代码调用上面写好的函数

%% 数据准备,1000个样本对,1000个测试对
P=1000;
Q=2;
MatrixX=6*rand(P,Q)-3*ones(P,Q);%%输入值
MatrixY=zeros(P,1);%%输出值
TestMatrixY=zeros(100,1);%%输出值
for i=1:1000
    MatrixY(i)=MatrixX(i,1)^2+MatrixX(i,2)^2;
end

%% 训练
M=200;%%中心点数
[deltas,weights,centers]=MyRBF(MatrixX,MatrixY,M);

%%  结果测试
TestX=6*rand(1000,2)-3*ones(1000,2);%%输入值
TestY=zeros(1000,1);%%输出值
for i=1:P
    sum1=0; 
    for j=1:M 
        tempDist=weights(j)*exp(-norm(TestX(i,:)-centers(j,:))^2/(2*deltas(j)^2)); 
        sum1=sum1+tempDist; 
    end 
    TestY(i)=sum1; 
end 
Test=[TestX TestY];
for i=1:P
    if(Test(i,3)<2)
        plot(Test(i,1),Test(i,2),'r.');
    elseif(Test(i,3)<4)
        plot(Test(i,1),Test(i,2),'b.');
    elseif(Test(i,3)<6)
        plot(Test(i,1),Test(i,2),'y.');
    elseif(Test(i,3)<8)
        plot(Test(i,1),Test(i,2),'g.');
    else
        plot(Test(i,1),Test(i,2),'k.');
    end
    hold on;
end
title('z=x^2+y^2训练值')     %标题

运行结果如下:
在这里插入图片描述
由上图可知,少数绿色的叫与黑色的点有交错,其余均满足环形分布,拟合结果正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饮血太岁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值