老饼讲解:一步一步上手学习
好了,上节我们说了RBF神经网络是如何使用插值法进行求解的了,这节我们继续来说说它的OLS法,它是插值法的改进,如果说插值法是最基础的算法,那么OLS法就是日常中所使用的方法了,后面我们使用的都是OLS算法。
前面我们已经了解了插值法求解RBF神经网络的方法了,它的特点是训练误差一定为0,但同时它也有一个很让人难受的缺点:有多少个样本,就有多少个隐节点!在数据较少时还好,但如果数据稍微多一些,模型就非常庞大了,正是如此,所以就有了OLS算法。
OLS算法全称为Orthogonal least squares正交最小二乘法,它的提出就是为了解决RBF插值法隐节点过多的问题。其实它的思路也很简单,无非就是插值法的隐节点过多嘛,所以它逐个挑选隐节点添加到模型中,直到误差足够小为止:

如图所示,n个样本就生成了n个待选隐节点,然后OLS算法逐个从中挑选能让误差最大下降的隐节点,添加到模型之中,随着隐节点越来越多,模型的误差就越来越小,当全部隐节点都添加时,就与插值法一样了,此时误差就为0了,但实际中,我们会设置一个目标误差goal,当模型的mse goal时,就停止添加隐节点了。
每次应该选择哪个隐节点才能使模型误差下降最大呢?这就是OLS算法的核心了,这里我们不再展开,因为它的实现略为复杂,但对使用RBF神经网络没太大帮助,如果想了解可以移步《RBF神经网络-自实现代码》,里面有详细原理讲解,以及自写代码复现matlab的newrb的效果。
好了,对于OLS算法,我们大概就知道它是怎么一回事了。
在matlab中,使用newrb来构建RBF神经网络时,调用的就是OLS算法,下面我们使用newrb函数来感受一下OLS算法的效果,具体示例如下:
% 本代码用于展示如何使用newrb构建一个RBF径向基神经网络
% 来自《老饼讲解-RBF神经网络》www.bbblearn.com ,matlab版本:2018a
%--------数据准备----------
x = linspace(-pi,pi,15); % 自变量x采样
y = sin(x); % 函数值y
%--------网络训练----------
[net,tr] = newrb(x, y, 0.01,1); % 以X,Y建立RBF神经网络,目标误差0.01,RBF宽度参数spread=1
py = sim(net,x); % 用建好的网络进行预测,这里的x是要用来进行预测的输入
% -------打印结果----------
disp('------训练过程-------') % 标题
train_record = [tr.epoch;tr.perf] % 训练过程
disp('------训练结果-------') % 标题
hn = size(net.lw{2,1},2); % 计算隐节点个数
mae = mean(abs(py-y)); % 计算MAE
disp(['隐节点个数:' ,num2str(hn)]) % 打印隐节点个数
disp(['MAE:' ,num2str(mae)]) % 打印隐节点个数
% 画出拟合曲线
plot(x,y,'*') % 画出样本点
hold on % 先hold on 一下
t= -pi:0.1:pi; % 生成拟合曲线的x
simt = sim(net,t); % 拟合的y
plot(t,simt,'r') % 画出拟合曲线
title('模型拟合结果') % 标题
legend('训练样本点','拟合曲线') % 图例代码运行结果如下:


从训练过程可以看到,没添加隐节点时,mse误差为0.4667,然后逐步添加隐节点,当添加了3个隐节点时,mse为0.007,此时比预设的目标误差0.01更小,因此就退出训练了,最终模型只需3个隐节点,就构建了一个效果不错的RBF神经网络,它已经能较好的拟合sin函数了。
总的来说,插值法是直接用所有RBF来建模,而OLS法设定一个目标误差,然后在满足目标误差的同时、挑尽量少的RBF来建模。如果把goal设为0时,它的结果就和插值法一样了。在实际使用中我们一般都使用OLS法(newrb函数)来建模,它明显比插值法(newrbe函数)更好用一些。
评论