RBF神经网络和BP神经网络的区别就在于训练方法上面:RBF的隐含层与输入层之间的连接权值不是随机确定的,是有一种固定算式的。下面以精确型RBF为例。
假设每个样本有R维的特征。有S1个训练集样本。IW1表示训练集,即S1XR的一个矩阵。
此时,输入一个R维的测试集样本p,首先将p和IW1计算欧氏距离。
RBF径向基函数的效果是:
所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc||)=exp{- ||x-xc||^2/(2*σ^2) } 其中xc为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。
简单地说,就是某个测试集样本p和某个训练集样本越接近,即欧氏距离越小,那么在RBF作用后输出的值就越大。
假设这个样本p和训练集中某个样本(即IW1中某一列)很相似(即欧氏距离dist很小),那么输出结果a1中(a1维度是S1X1)就有一个值会很大。经过权重和偏置的作用后,再进入线性分类器中,就很容易可以分出来。这是我的直观的理解。
生成RBF的matlab函数:net = newrbe(P,T,spread)。只有一个参数spread需要调整。
P
RxQ matrix of Q R-element input vectors
T
SxQ matrix of Q S-element target class vectors
spread
Spread of radial basis functions (default = 1.0)
The larger the spread is, the smoother the function approximation will be. Too large a spread can cause numerical problems.
也就是说,spread这个参数越大,RBF图像越平滑,RBF的输出差距不大,则所有输入的作用都会被减弱。
关于此算法,MATLAB文档中给出了很精炼的解释:
newrbe creates a two-layer network. The first layer has radbas neurons, and calculates its weighted inputs with dist and its net input with netprod. The second layer has purelin neurons, and calculates its weighted input withdotprod and its net inputs with netsum. Both layers have biases.
newrbe sets the first-layer weights to P', and the first-layer biases are all set to 0.8326/spread, resulting in radial basis functions that cross 0.5 at weighted inputs of +/– spread.
(就是说这样设计出默认的RBF的效果是,关于X=0对称,横轴为+/-0.8333时函数的纵轴坐标值大约是0.5,表现在图中就是cross于这个点。如果加权后输入是+/- spread的话,正好产生此效果。)
The second-layer weights IW{2,1} and biases b{2} are found by simulating the first-layer outputs A{1} and then solving the following linear expression:
[W{2,1} b{2}] * [A{1}; ones] = T
也就是说,RBF实际上是一个两层的神经网络。很简单,隐层是使用RBF作为激活函数的神经元,输出层采用线性函数的神经元,做一个线性分类。在前面的dist计算欧氏距离过程中,RBF采用高斯函数,实际上是将数据转化到高维空间,认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此输出层是线性的。
上面也解释了本文开头中讲的,神经元之间非随机的权值是如何计算的:实际上,第一层的权值设为输入矩阵P的转置。而第二层的权值和偏置是要通过输入参数T、第一层的output结果来反推的。
下面是MATLAB文档中给的简单代码:
下面是一个例子
%% I. 清空环境变量
clear all
clc
%% II. 训练集/测试集产生
%%
% 1. 产生随机数据
NIR = rand(60,5);
%%
% 2. 随机产生训练集和测试集
temp = randperm(size(NIR,1));
% 训练集――50个样本
P_train = NIR(temp(1:50),:)';
T_train = NIR(temp(1:50),:)';
% 测试集――10个样本
P_test = NIR(temp(51:end),:)';
T_test = NIR(temp(51:end),:)';
N = size(P_test,2);
%% III. RBF神经网络创建及仿真测试
%%
% 1. 创建网络
net = newrbe(P_train,T_train,30);
%%
% 2. 仿真测试
T_sim = sim(net,P_test);
%% IV. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;
%%
% 2. 结果对比
result = [T_test' T_sim' error']
%% V. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')