老饼讲解:一步一步上手学习
广义回归神经网络GRNN(General Regression Neural Network)是D.F.Specht在1991年提出的一种神经网络,与径向基神经网络有异曲同工之处,所以也属于RBF神经网络,它主要用来解决回归问题,这节就带大家来看看GRNN神经网络的原理,以及如何用GRNN来解决回归问题。
下面我们先来看看GRNN是用什么方法来解决回归问题的,了解完它的思想,就很容易理解它的模型了。
我们不妨从一个简单的回归问题上手,如下:
如图所示,现在有2个已经知道输入、输出的样本 和,对于新样本 ,它 的 值应该是多少?
-----------分割线-----------
其实我们自然而然都会想到一个方向,就是要利用已知的x1,x2的信息,来推出新样本x的值。GRNN正是这样干的,它假设与任何一个已有样本相同的概率都服从正态分布:

则易知:
样本与样本相同的概率为 :
样本与样本相同的概率为 :
将概率归一化后,就会消去,以为例,如下:
最后,就可以得到y的期望为:
简单来说,广义回归的思想就是评估新样本属于各个训练样本点的概率各是多少,然后以概率加权得到新样本的输出值评估。
好了,我们进一步把x扩展为多维向量,并整理一下上面的公式。
Step-1. 计算RBF
首先,需要计算出各个样本点的RBF值,计算过程为:
这里有几点说明:
1. 我们用来代表第i个样本
2. 由于x是多维向量,所以用二范数来替代一维时的,
3. 由于属于一种RBF函数,所以我们把它记为。
Step-2. 计算概率值
进一步将RBF进行归一化,就得到属于各个样本点的概率:
Step-3. 计算y
最后,就可以求得y的期望:
来说明一下,是好理解的,各个样本y值的概率加权和就是y的期望了,进一步地,写为矩阵形式,就是,其中Y代表整个样本集的y。
好了,其实从上面的解说,我们都知道GRNN大概是怎么一回事了,那下面我们再来正式地来认识一下GRNN的神经网络拓扑结构,如下:

我们看着图来理解它的意思。
首先是输入层到隐层,每个隐节点的取值为:
可知,每个实际就是第i个训练样本,而每个隐节点就是归一化后的RBF,实际代表着属于各个样本的概率。这也意味着有多少个训练样本,就会有多少个隐节点。
再来看它的输出,输出的取值为:
就是第j个隐节点与第i个输出的连接,所以它是第j个样本的第i个输出,可知,每个实际就是样本集Y。
好了,我们用一个具体的例子来解说一下。
先来设置我们模型隐层的阈值,不妨设为:
现在设我们有3个2输入、2输出的样本,如下:
每列代表一个样本,每行代表一个变量
那么,GRNN的隐层、输出层权重就为:
假设现在模型的输入为:
下面我们来计算模型的输出。
Step-1:计算隐层的RBF值
Step-2:计算隐层的归一化值
Step-3:计算输出层
从整个计算过程可以知道,广义回归神经网络GRNN是最简单的神经网络,不需要任何计算,就能将网络构建出来,GRNN只需要把训练样本的 X , y 保存起来,并设置好隐层的阈值 就可以了,来了新样本,只要按上述公式来计算预测值就可以了,即它是一个生成模型,整个构建过程不需任何训练。
如上面所说,要实现一个GRNN其实是很简单的,就是把训练样本X,y保存起来,并设置好隐层的阈值 就可以了。但更方便的,我们也可以借助matlab的神经网络工具箱来实现,在matlab中可以使用newgrnn来构建一个广义回归神经网络,下面我们就展示一下,如何用matlab工具箱来构建一个GRNN模型,用于解决回归问题。
闲话少说,直接上代码!GRNN代码示例如下:
% 本代码展示如何用matlab工具箱训练一个GRNN广义回归神经网络
% 本代码来自《老饼讲解神经网络》www.bbblearn.com ,matlab版本:2018a
% ---------------------------------------------------------
%----数据准备----
x1 = 1:0.2:10; % 生成x1
x2 = -5:0.2:4; % 生成x2
X = [x1;x2]; % 将x1,x2作为输入数据
Y = sin(X(1,:))+X(2,:); % 输出数据
%----网络训练----
net = newgrnn(X,Y,1); % 网络建立与训练,第三个参数用于控制径向基的宽度
simY = sim(net, X); % 用建好的网络预测原始数据
%----结果对比----
figure(1); % 初始化画布
t = 1:size(Y,2); % 数据序号
plot(t,Y,'*',t,simY,'r') % 画出预测值与拟合值
legend('真实值','拟合值') % 图例代码运行结果如下:

可以看到,模型基本拟合了原本的数据样本点。
GRNN广义回归神经网络,实际就是评估新样本属于各个训练样本的概率,然后再计算新样本输出的期望值。构建GRNN时,只需要直接存储历史样本的X和y就可以了,并不需要任何训练。
评论