【机器学习】概率神经网络(PNN)的python实现

  • 一、概率神经网络原理
    • 1.1、贝叶斯决策
    • 1.2、PNN的网络结构
  • 二、概率神经网路的优点与不足
    • 2.1、优点(参考资料【1】)
    • 2.2、缺点
  • 三、PNN的python实现
  • 参考资料

一、概率神经网络原理

概率神经网络(Probabilistic Neural Network)的网络结构类似于RBF神经网络,但不同的是,PNN是一个前向传播的网络,不需要反向传播优化参数。这是因为PNN结合了贝叶斯决策,来判断测试样本的类别。

1.1、贝叶斯决策

假设对于测试样本xxx,共有mmm中类别可能{w1,⋯ ,wm}\{ {w_1}, \cdots ,{w_m}\}{w1​,⋯,wm​},则判断样本类别的贝叶斯决策是:

max⁡{p(w1∣x),p(w2∣x),⋯ ,p(wm∣x)}\max \{ p({w_1}\left| x \right.),p({w_2}\left| x \right.), \cdots ,p({w_m}\left| x \right.)\}max{p(w1​∣x),p(w2​∣x),⋯,p(wm​∣x)}

1.2、PNN的网络结构

要介绍上述概率密度p(wi∣x)p({w_i}\left| x \right.)p(wi​∣x)如何计算,首先要介绍PNN的网络结构。

本博文的PNN结构图参考资料【2】,图中样本特征维度为3,由上图可知,PNN的网络结构分为四层:输入层,模式层、求和层、输出层。假设训练样本为{trx1,trx2,⋯ ,trxl}\left\{ {tr{x_1},tr{x_2}, \cdots ,tr{x_l}} \right\}{trx1​,trx2​,⋯,trxl​},其中样本个数为lll。PNN各层的作用于相互之间关系描述如下:
输入层:输入测试样本,节点个数等于样本的特征维度。
模式层:计算测试样本与训练样本中的每一个样本的Gauss函数的取值,节点个数等于训练样本的个数。
测试样本xxx与第jjj个训练样本trxjtrx_jtrxj​之间的Gauss函数取值(对于测试样本xxx,从第jjj个模式层节点输出的数值)为:
Gauss(x−trxj)=e−∥x−trxj∥2δ2Gauss(x - tr{x_j}) = {e^{ - \frac{{\left\| {x - tr{x_j}} \right\|}}{{2{\delta ^2}}}}}Gauss(x−trxj​)=e−2δ2∥x−trxj​∥​
其中δ\deltaδ是模型的超参数(机器学习模型中,超参数是在开始学习过程之前设置值的参数),需要提前设定,也可以通过寻优算法(GA,QGA,PSO,QPSO等)获得。
求和层:求取相同类别测试样本对应的模式层节点输出之和,节点个数等于训练样本的类别个数。
输出层:对上述求和层输出进行归一化处理求取测试样本对应不同类别的概率,根据概率大小判断测试样本的类别,节点个数为1。

二、概率神经网路的优点与不足

2.1、优点(参考资料【1】)

收敛快:没有模型参数需要训练,收敛速度快。
非线性逼近:可以实现任意的非线性逼近,用PNN网络形成的判决曲面与贝叶斯最优准则下的曲面非常接近。
容错性高:模型层采用径向基函数(Gauss函数),考虑了不同类别样本之间的相互影响,对异常数据不敏感。

2.2、缺点

计算复杂度高:每个测试样本要与全部的训练样本进行计算。
空间复杂度高:因为没有模型参数,对于测试样本全部的训练样本都要参与计算,因此需要存储全部的训练样本。

三、PNN的python实现

完整python代码与样本地址:https://github.com/shiluqiang/PNN_python
本博文采用的数据集有两个类别,用全部的数据集作为训练集,数据集中的一半作为测试集,Gauss函数中的δ\deltaδ设为0.1。
首先,对测试集和训练集进行归一化处理。

def Normalization(data):'''样本数据归一化input:data(mat):样本特征矩阵output:Nor_feature(mat):归一化的样本特征矩阵'''m,n = np.shape(data)Nor_feature = copy.deepcopy(data) sample_sum = np.sqrt(np.sum(np.square(data),axis = 1))   for i in range(n):Nor_feature[:,i] = Nor_feature[:,i] / sample_sum        return Nor_feature

然后,计算测试集样本与训练集样本的欧氏距离。

def distance(X,Y):'''计算两个样本之间的距离'''return np.sqrt(np.sum(np.square(X-Y),axis = 1))
def distance_mat(Nor_trainX,Nor_testX):'''计算待测试样本与所有训练样本的欧式距离input:Nor_trainX(mat):归一化的训练样本Nor_testX(mat):归一化的测试样本output:Euclidean_D(mat):测试样本与训练样本的距离矩阵'''m,n = np.shape(Nor_trainX)p = np.shape(Nor_testX)[0]Euclidean_D = np.mat(np.zeros((p,m)))for i in range(p):for j in range(m):Euclidean_D[i,j] = distance(Nor_testX[i,:],Nor_trainX[j,:])[0,0]return Euclidean_D

其次,计算上述距离矩阵对应的Gauss函数值矩阵。

def Gauss(Euclidean_D,sigma):'''测试样本与训练样本的距离矩阵对应的Gauss矩阵input:Euclidean_D(mat):测试样本与训练样本的距离矩阵sigma(float):Gauss函数的标准差output:Gauss(mat):Gauss矩阵'''m,n = np.shape(Euclidean_D)Gauss = np.mat(np.zeros((m,n)))for i in range(m):for j in range(n):Gauss[i,j] = math.exp(- Euclidean_D[i,j] / (2 * (sigma ** 2)))return Gauss

再次,计算每个测试样本对应于每个类别概率和训练样本的类别种类。

def Prob_mat(Gauss_mat,labelX):'''测试样本属于各类的概率和矩阵input:Gauss_mat(mat):Gauss矩阵labelX(list):训练样本的标签矩阵output:Prob_mat(mat):测试样本属于各类的概率矩阵label_class(list):类别种类列表'''## 找出所有的标签类别label_class = []for i in range(len(labelX)):if labelX[i] not in label_class:label_class.append(labelX[i])n_class = len(label_class)## 求概率和矩阵p,m = np.shape(Gauss_mat)Prob = np.mat(np.zeros((p,n_class)))for i in range(p):for j in range(m):for s in range(n_class):if labelX[j] == label_class[s]:Prob[i,s] += Gauss_mat[i,j]Prob_mat = copy.deepcopy(Prob)Prob_mat = Prob_mat / np.sum(Prob,axis = 1)return Prob_mat,label_class

最后,根据测试样本对应于每个类别概率和训练样本的类别种类求出测试样本对应的类别。

def calss_results(Prob,label_class):'''分类结果input:Prob(mat):测试样本属于各类的概率矩阵label_class(list):类别种类列表output:results(list):测试样本分类结果'''arg_prob = np.argmax(Prob,axis = 1) ##类别指针results = []for i in range(len(arg_prob)):results.append(label_class[arg_prob[i,0]])return results

参考资料

1、https://blog.csdn.net/guoyunlei/article/details/76209647
2、https://wenku.baidu.com/view/bb2f52c64128915f804d2b160b4e767f5acf804b.html

【机器学习】概率神经网络(PNN)的python实现相关推荐

  1. 概率神经网络 PNN

    1 概率神经网络 概率神经网络(PNN)于1989年由D. F. Specht 博士首先提出,是一种常用于模式分类的神经网络.概率神经网络是基于统计原理的神经网络模型,在分类功能上与最优Bayes 分 ...

  2. 单目标应用:基于北方苍鹰优化算法NGO的概率神经网络PNN数据分类(提供MATLAB代码)

    一.北方苍鹰优化算法NGO 北方苍鹰优化算法(Northern Goshawk Optimization,NGO)由MOHAMMAD DEHGHANI等人于2022年提出,该算法,该算法模拟了北方苍鹰 ...

  3. 基于灰狼算法优化概率神经网络PNN的分类预测-附代码

    基于灰狼算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于灰狼算法优化概率神经网络PNN的分类预测 - 附代码 1.PNN网络概述 2.变压器故障诊街系统相关背景 2.1 模型建立 3. ...

  4. 基于综合几何特征和概率神经网络的故障诊断(翻译)

    原文:Fault diagnosis based on comprehensive geometric characteristic and probability neural network 链接 ...

  5. 【机器学习】神经网络BP理论与python实例系列

    理论部分 <机器学习--人工神经网络之发展历史(神经元数学模型.感知器算法)> <机器学习--人工神经网络之多层神经网络(多层与三层)> <机器学习--人工神经网络之后向 ...

  6. 机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

    目录 一.理论知识回顾 1.神经网络模型 2.明确任务以及参数 1)待估参数: 2)超参数: 3)任务 3.神经网络数学模型定义 1)激活函数 ​ 2)各层权重.阈值定义 3)各层输入输出定义 4.优 ...

  7. 【机器学习】隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现 一.前向算法 二.后向算法 三.前向-后向算法的python实现 参考资料 隐马尔可夫(HMM)模型的第一个基本 ...

  8. 概率神经网络(PNN)

    概率神经网络 一.概率神经网络简介         注意:以下内容参考贝叶斯决策理论. 二.概率神经网路的网络结构(PNN) 总结:         1.输入层接收样本的值,神经元个数与输入向量长度相 ...

  9. 【机器学习】RBF神经网络原理与Python实现

    [机器学习]RBF神经网络原理与Python实现 一.RBF神经网络原理 1. RBF神经网络结构与RBF神经元 2. RBF神经网络求解 2.1 正向传播:计算误差 2.2 反向传播:调整参数 二. ...

最新文章

  1. 关闭Delphi的RTTI
  2. Oracle的连接与会话
  3. 计算机组成原理 — CPU — 流水线与执行周期
  4. apk 反编译_APK反编译与回编译修改包名实现分身
  5. webService学习1:myeclipse解析wsdl
  6. WEB前端 javascript、php关键字搜索函数的使用方法
  7. Spring和JSF集成:导航
  8. php 自带缓存,封装ThinkPhP自带的缓存机制
  9. ubuntu系统设置开机自启动
  10. mysql目录树_MySQL B+树目录及索引优化_mysql
  11. 95-36-200-ChannelHandler-系统Channel-LoggingHandler
  12. Freeradius+mysql+daloradius简单安装配置
  13. linux crontab怎么启动,【linux之crontab,启动】(示例代码)
  14. Steam[ASF]挂卡(挂游戏时间)纯新手教学
  15. 服务器c盘满了怎么清理? 服务器c盘空间不足清理方法
  16. AR/VR应用前景探讨
  17. 二级域名原理以及程序代码
  18. 2018年的第一篇文章(福利篇)
  19. 华为鸿蒙到底卡不卡,华为mate book14,办公作图就靠它了
  20. 2345浏览器如何启用过滤弹窗广告

热门文章

  1. 问题三十八:C++中bad alloc问题(1)——分析问题
  2. Scikit-Learn库概述
  3. 如何提高大数据分析的效果
  4. 辐流式重力浓缩池计算_污泥浓缩池工作方式
  5. stone (组合数学 + Lucas定理)
  6. inteliJ maven 打包时把依赖的包一起打
  7. AndroMDA 4.x架构(2)
  8. oracle通过闪回查询表的更改记录
  9. POJ-1426-Find The Multiple
  10. 用Python给对方发个邮箱就可以使对方自动关机,鬼知道你干了什么?