RBF函数在神经网络控制中较为常见,MATLAB中早已集成了一个newrb的函数,在一些场景下使用起来还比较方便。尤其是涉及到进行函数逼近的时候。
NEWRB Design a radial basis network.
Synopsis
[net,tr] = newrb(P,T,GOAL,SPREAD,MN,DF)
Description
Radial basis networks can be used to approximate functions. NEWRB adds neurons to the hidden layer of a radial basis network until it meets the specified mean squared error goal.NEWRB(P,T,GOAL,SPREAD,MN,DF) takes these arguments,
P - RxQ matrix of Q input vectors.
T - SxQ matrix of Q target class vectors.
GOAL - Mean squared error goal, default = 0.0.
SPREAD - Spread of radial basis functions, default = 1.0.
MN - Maximum number of neurons, default is Q.
DF - Number of neurons to add between displays, default = 25.
and returns a new radial basis network.
newrb设计了径向基网络,调用格式:
net = newrb
[net,tr] = newrb(P,T,goal,spread,MN,DF)
P-Q组输入向量组成的R×Q维矩阵;
T-Q组目标分类向量组成的S×Q维矩阵;
goal-均方误差,默认值为0;
spread-径向基函数的扩展速度,默认值为1;
MN-神经元的最大数目,默认是Q
DF-两次显示之间所添加的神经元数目,默认值为25;
net-返回值,一个径向基网络;
tr-返回值,训练纪录。
该函数设计的径向基网络net可用于函数逼近。径向基函数的扩展速度spread越大,函数的拟合就越平滑。但是,过大的spread意味着需要非常多的神经元以适应函数的快速变化。如果spread设定过小,则意味着需要许多神经元来适应函数的缓慢变化,这样一来,设计的网络性能就不会很好。
%%%%%%%%%%一元函数逼近%%%%%%%%%%
clear,clc;
x=linspace(-20,20,100); %神经网络输入值
t=10*x-30*sin(x)-80*tansig(x); %神经网络目标值
plot(x,t,'+'); %待逼近的函数图像
hold on
net=newrb(x,t,1,2); %平方和误差小于1
y=net(x);%神经网络输出值
plot(x,y,'g'); %仿真的函数图像
title('RBF神经网络函数逼近');
xlabel('输入值');
ylabel('目标值/输出值');
mse(y,t) %平方和误差
%%%%%%%%%%二元函数逼近%%%%%%%%%%
clear,clc
t=0:0.1:10*pi; %辅助参数
x=(t+0.5*pi).*sin(t+0.5*pi); %神经网络输入值(指标1)
y=(t+0.5*pi).*cos(t+0.5*pi); %神经网络输入值(指标2)
z=1.5*t; %神经网络目标值
net=newrb([x;y],z,0.001,2); %平方和误差小于0.001
zf=net([x;y]);%神经网络输出值
plot3(x,y,zf,'r'); %仿真的函数图像
hold on
plot3(x,y,z,'+'); %待逼近的函数图像
title('RBF神经网络函数逼近');
xlabel('输入值(指标1)');
ylabel('输入值(指标2)');
zlabel('目标值/输出值');
grid on
mse(zf,z) %平方和误差
首先应该特别注意数据的维度,对于上面的P和T,P是R×Q维矩阵,其中R是输入层神经元数目(即输入个数),Q是有多少组数据;T是S×Q维矩阵,其中S是输出层神经元数目(即输出个数),Q与输入应对应。
得到的net网络,输入net
可以直接查看其参数,
查看RBF网络的参数和查看BP网络的参数都是一样的方法,MATLAB的命令为net.IW{1},net.LW{2},net.b,只是代表的意义不一样,在BP里面net.IW{1}是输入层到隐藏层的权重,net.LW{2}是隐藏层到输出层的权重,net.b是阈值;在RBF里面,net.IW{1}就是各神经元的基向量,net.LW{2}是隐藏层到输出层的权重,net.b{1}是基宽,net.b{2}是输出层的阈值,比如下面这个例子:
% 下面例子中有几处转置,是为了符合平时表达习惯设置的,具体使用时需要注意不要因此出错,
% 尤其是当数据不是一维时可能会和下面不太一样
clear all
P = [1 2 3];
T = [2.0 4.1 5.9];
net = newrbe(P,T);
c = net.iw{1}' % 注意转置
W = net.lw{2}
b = net.b{1}
bi= net.b{2}
x = [0];
for j=1:1:3
h(j)=exp(-norm(x'-c(:,j))^2*(b(j)^2))
end
% 下面三个式子得出的结果是一样的
W*h'+bi % 注意转置
net(0)
0.56*exp(-(0.83225*sqrt((2-0)^2 ))^2 )+4.16*exp(-(0.83225*sqrt((3-0)^2 ))^2 )+1.46