概述
径向基函数神经网络的基本原理,就是将样本对中输入变量和输出变量间的关系解析成多个径向基函数的总和。以二维输入样本X,一维输出样本Y为例,中心点为三个:
符号说明:Center是中心点矩阵,k是权值矩阵,b是阀值矩阵。
上述图中,当样本输出值Y和训练值Z之间接近并且达到预期精度时,就可以认为结果正确,训练结束。该算法通过训练后,需要输出就是上述三个矩阵:中心点矩阵、权值矩阵、阀值矩阵。
流程图
要求出上述三个矩阵,可分为寻找中心点、求阀值、求权值三步,流程如下:
代码实现
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训练值') %标题
运行结果如下:
由上图可知,少数绿色的叫与黑色的点有交错,其余均满足环形分布,拟合结果正确。