老饼讲解:一步一步上手学习
概率神经网络PNN全称为Probabilistic Neural Networks,它是D.F.Specht在1989年提出的一种径向基神经网络,它主要用于解决模式识别问题(也就是分类问题),由于它的隐层激活函数也是使用RBF函数,所以在广义上,它也属于一种RBF神经网络。好了,下面就让我们一起来看看PNN概率神经网络吧!开车!
如果了解过GRNN广义回归神经网络,就会发现PNN和GRNN很像,它们的原理基本差不多,只不过GRNN用于做回归,而PNN则用于做模式识别(也就是分类问题)。PNN解决类别预测问题的思路如下:

它假设x与任何一个已有样本中相同的概率都服从正态分布,那么,样本认为样本与它相同的概率为 : ,再以所有历史样本的概率评估作为评分,并以k类历史样本的评分占比作为样本属于k类的概率,则PNN评估样本x属于类别的概率为:
由于上式的分母对于所有k都是一样的,因此,在类别判别时可以只用分子部分,即PNN判别函数为:
在样本判别时,只需要比较哪类样本的判别值大,就认为样本x属于哪个类别。
PNN神经网络一般用如下的三层神经网络的形式来表示,它的拓扑图如下:

可以看到,PNN就是一个三层的神经网络,有多少个历史样本点,就有多少个隐节点,每个隐节点就代表着一个历史样本点对样本的评分,如下:
其中,是输入层与第i个隐节点的连接权重,由于属于RBF(径向基)函数,所以每个隐节点都是一个RBF,而就是该隐节点的中心,实际上就是第i个历史样本的x。 则是隐层的阈值,它代表隐节点RBF的宽度 ,通常是一个预设的超参数。
再来看下输出层,输出层每个节点代表一个类别,有多少个类别就有多少个输出节点,每个隐节点都只与一个输出连接,当第i个隐节点属于类别j时,它就与第j个输出连接,而第j个输出节点就是所有与它连接的隐节点之和,如下:
这里的是隐层与第j个输出的连接权重,当连接时为1,不接连时为0,所以上式就是所有连接隐节点的和。进一步地,将类别的判别值进行竞争,就得到模型最终的输出,如下:
这里的是竞争函数,它将向量最大的值置为1,其余置0。
好了,下面我们以一个具体的例子来解说一下PNN是怎么计算的,就一清两楚了。
以 为例
一、先计算径向基的值
二、计算判别值
三、计算竞争后的类别结果
从上面的计算就知道,PNN只需要把训练样本的 X保存为 , y 保存为,并设置好隐层的阈值 的值就可以了,来了新样本,只要按上述表达式来计算预测值就可以了,所以PNN是一个生成模型,整个构建过程不需任何训练。
在matlab中,可以使用newpnn来构建一个PNN概率神经网络,具体代码实现如下:
% 本代码展示如何用matlab工具箱训练一个PNN概率神经网络
% 本代码来自《老饼讲解神经网络》www.bbblearn.com ,matlab版本:2018a
% 训练数据
P = [1 2 3 4 5 6 7]; % 输入数据
Tc = [1 2 3 2 2 3 1] % 输出数据:类别编号
T = ind2vec(Tc); % 将类标转换为onehot编码格式
%构建PNN神经网络与预测
net = newpnn(P,T); % 生成一个概率神经网络
Y = sim(net,P); % 用网络进行预测
Yc = vec2ind(Y) % 将预测结果转为类别编号 运行结果如下:

可以看到,PNN预测的样本类别Tc与真实类别Tc一致,说明模型是有效的
PNN是一种用来做类别预测的模型,它根据历史样本来评估新样本的属于各个类别的概率,在实际中只需要使用判别值,所以一般使用判别公式来计算各个类别的判别值就可以了,最后再compet来确定属于哪个类别。在实际使用中,只需要在matlab中使用newpnn就可以构建一个PNN神经网络了,但它的原理只是存储了训练样本的X、y,再按公式来计算模型的输出,所以PNN是不需要训练的。
评论