PNN(模式识别).docVIP

  • 17
  • 0
  • 约5.63千字
  • 约 12页
  • 2016-03-31 发布于湖北
  • 举报
PNN(模式识别).doc

概率神经网络 概率神经网络(Probabilistic Neural Networks,PNN)是由D. F. Specht在1990年提出的。主要思想是用贝叶斯决策规则,即错误分类的期望风险最小,在多维输入空间内分离决策空间。它是一种基于统计原理的人工神经网络,它是以Parzen窗口函数为激活函数的一种前馈网络模型。PNN吸收了径向基神经网络与经典的概率密度估计原理的优点,与传统的前馈神经网络相比,在模式分类方面尤其具有较为显著的优势。 PNN的结构如图所示,共由四层组成,以3类为例,同时设特征向量维数为3。 每层的介绍如下: 在PNN的神经网络模型中,输入层中的神经元数目等于学习样本中输入向量的m,各神经元是简单的分布单元,直接将输入变量传递给样本层。 样本层的节点数由输入样本和待匹配类别的乘积决定,为m*L。样本层是将输入节点传来的输入进行加权求和,然后经过一个激活函数运算后,再传给求和层。这里激活函数采用高斯函数,则输出为: 式中为径向基函数的中心,表示特性函数第i个分量对弈的开关参数。些层中每个节点均为RBF的中心,采用的特性函数为径向基函数—高斯函数,计算未知模式与标准模式间相似度。 求和层各单元只与相应类别的模式单元相连,各单元只依据Parzen方法求和估计各类的概率,即其条件概率为: 式中为类别,X为识别样本,为类别i的模式样本(在概率神经网络中做为权值),m为向量维数,为平滑参数,n为类i的模式样本数量。先验概率记为P(X)。 决策层节点数等于待匹配类别数,为L。根据各类对输入向量概率的估计,采用Bayes分类规则,选择出具有最小“风险”的类别,即具有最大后验概率的类别,可用下式来表达其决策方法对所有i 则输出y(X)= 。 基本学习算法 归一化训练样本矩阵 ,该矩阵的训练样本有m个,每一个样本维数为n。 ,归一化系数。 ,C即为归一化后的学习样本。 将归一化好的m个样本送入到网络输入层中 模式距离的计算 该距离是指样本矩阵与学习矩阵中相应元素之间的距离。 假设将由P个n维向量组成的矩阵称为待识别样本矩阵,则经归一化后,需要待识别的输入样本矩阵为: ,待分类样本矩阵,有p个,每一个样本维数为n。 计算欧式距离:就是需要识别的归一化的样本向量,与每一个归一化后的训练样本()的欧式距离。 归一化的训练样本,i=1,2,...,m; 归一化的待分类样本,j=1,2,...,p; :表示第i个待分类样本()与第j个训练样本()的欧式距离。 模式层高斯函数的神经元被激活 学习样本与待识别样本被归一化后,通常取标准差=0.1的高斯型函数。激活后得到初始概率矩阵: 在网络的求和层求得初始概率和 假设样本有m个,那么一共可以分为c类,设属于每一类的样本数目分别为,,,,且,在每一行中、、、分别取不同的值,则可以在网络的求和层求得各个样本属于各类的初始概率和: 计算概率 计算概率,即第i个样本属于第j类的概率。 ,概率值最大的那一类即为所属类。 微博好友特性分类 本实验中,类别定为4类:明星,同学,同事,密友。特征定为3类,分别以落入不同的范围来表征,利用前面建立起来的模型进行分类。 明星(1-20, 21-40, 41-60) 同学(61-80,81-100, 101-120) 同事(121-140, 141-160, 161-180) 密友(181-200, 201-220, 221-240) 每一组用20个训练样本,样本来自于程序中生成的满足一定范围的随机数。训练样本的个数是可以认为控制的,只要修改程序中的宏就可以。 在本实验中,我们自己定义一些待分类样本: 明星:蔡康永(10,30,50) 琢磨先生(15,35,55) 韩寒(5,25,45) 同学:张三(70,90,110) 李四(65,85,105) 王五(75,95,115) 同事:张一(130,150,170) 李二(125,145,165) 王三(135,155,175) 亲人:妈妈(190,210,230) 哥哥(185,205,225) 姐姐(195,215,235) 运行结果如下: 偶尔也会出现分类错误的时候: 不过分类错误的情况很少,运行程序很多次才偶尔会出错。原因可能是因为训练样本是随机生成的随机数,不一定都在那个范围内均匀分布,可能会偏大或偏小,造成计算欧式距离时出现分类的错误。 程序的运行环境为vs2013。 #include iostream #include fstream #include cstdlib #include string #include ctime #include cmath #define p 12 #define m 80 using namespace std; struct Data1 { double

文档评论(0)

1亿VIP精品文档

相关文档