BP神经网络分类代码
最后更新于:2024-04-30 23:59:07
神经网络“分类”工具箱是专为使用神经网络进行分类的工具箱。
工具箱中的代码在不定期更新中,不断完善和添加新的功能。
致力于实现优质、易用的程序,帮助研究人员快速实现目标
一、代码运行环境:
MATLAB2016及更新版本。
二、文件说明

注:图标代表该m文件为脚本文件,可以直接运行;
图标代表函数文件,在没有输入变量的情况下无法直接运行。更详细的解释可以看这里。
1. demoBPclass.m
使用BP神经网络进行分类的脚本代码,可以直接运行,主要用于演示bpPatternnet函数的用法。该脚本中使用了鸢尾花数据集来进行演示。程序运行完成后,将会得到以下几张图片和运行结果。



另外,在命令行窗口,会打印出模型识别的正确率、召回率、精确率。

2.bpPatternnet.m
快速模式识别(分类)神经网络的封装函数,只需要导入输入和输出数据,以及一些必要的参数,就可以自动实现训练和画图,并得到测试集分类正确率。该函数不能直接运行,而是需要调用。调用方法在demoBPclass.m文件中演示。
function [net,acc,recall, precision] = bpPatternnet(dataX,dataY,trainRatio,hiddenSizes,auto,set,figflag)
% 快速模式识别(分类)神经网络,可以自主设定训练集比例,并得到测试集分类正确率
% 输入:
% dataX:输入的训练集,R*Q的矩阵,R为特征维度,Q为批次数,输入该变量时一定要注意行列方向是否正确
% dataY:训练集的标签值,U*Q的矩阵或1*Q的cell向量,U为标签种类数,Q为批次数,输入该变量时一定要注意行列方向是否正确
% trainRatio:训练集占总数据的比例,小于1的数值,例如trainRatio=0.8时,80%数据用于训练
% hiddenSizes:神经网络隐藏层数
% auto:是否进行自动纠错,'on'为是,否则为否。开启自动纠错后会智能调整训练、测试集的行列方向。
% set:网络的额外设置,具体设置包括:
% - trainFcn:训练函数,默认为'trainscg',可选的训练函数有:
% - 'trainscg':比例共轭梯度方向传播
% - 'trainbfg':BFGS准牛顿反向传播
% - 'traincgb':具有Powell-Beale重启的共轭梯度方向传播
% - 'traincgf':具有Fletcher-Reeves更新的共轭梯度反向传播
% - 'traincgp':具有Polak-Ribiére更新的共轭梯度反向传播
% - 'traingda':自适应学习速率方向传播的梯度下降
% - 'traingdm':动量方向传播的梯度下降
% - 'traingdx':动量梯度下降和自适应学习速率反向传播
% - 'trainlm':Levenberg-Marquardt反向传播
% - 'trainoss':一步割线反向传播
% - 'trainrp':弹性反向传播
% - transferFcn:传递函数,默认为'tansig',可选的传递函数有:
% - 'tansig':双曲正切sigmoid函数
% - 'logsig':对数sigmoid函数
% - 'purelin':线性传递函数
% - epochs:最大迭代次数,默认为1000,用于控制神经网络的训练迭代次数上限
% figflag:是否画图,设置为1时画混淆矩阵图、真实类别与预测类别对比图
% 输出:
% net:训练完成的神经网络
% acc:使用测试集得到的模式识别正确率,1对应100%正确
% recall:召回率
% precision:精确率
3. class2label.m
将class转为label 例如将[3,2,1,1]转换为[0,0,1;0,1,0;1,0,0;1,0,0] p文件,可以调用
4. class2label.m
将label转为class 例如将[0,0,1;0,1,0;1,0,0;1,0,0]转换为[3,2,1,1] p文件,可以调用
5.EvaluteClassResultsV2.m
用于评估分类结果的函数。调用该函数可以实现绘制混淆矩阵(两种),可视化测试集真实类别和预测类别,以及计算召回率和准确率。
function [recall, precision] = EvaluteClassResultsV2(outputs,targets,figflag)
% 对分类结果进行评价,包括:
% 两种混淆矩阵图、可视化测试集真实类别和预测类别
% 计算 weigthed-Precision, weigthed-Recall和F1-score 参考 https://zhuanlan.zhihu.com/p/147663370?from_voters_page=true
% 输入:
% outputs:经过分类算法得到的分类结果,一维正整数
% targets:目标分类结果,一维正整数
% figflag:是否画图,'on'为画图,'off'为不画
% 输出:
% recall: 召回率
% precision: 精确率
6.fisheriris.mat
鸢尾花数据集,其中包含meas变量,是鸢尾花数据集的特征,用于模型的输入。species是类别数据,用于模型的输出。
三、快速开始
1.运行测试脚本
先在MATLAB里打开下载好的文件夹,然后运行demoBPclass.m程序,程序运行完毕后如果没报错,且正常画出混淆矩阵等图像,则说明运行环境正常,程序正确。
2.修改仿真数据/导入数据
复制一个demoBPclass.m的文件副本,在这个副本里做如下修改:
根据你的文件类型的不同(excel,txt,csv等),将数据导入MATLAB的方法有所不同。同学们可以看博主针对常用文件的导入方法的这个教程,教程上未包含的数据类型,大家可以再参考这个文档。
需要注意,导入的数据需要满足数据格式要求:
% dataX:输入的训练集,R*Q的矩阵,R为特征维度,Q为批次数,输入该变量时一定要注意行列方向是否正确 % dataY:训练集的标签值,U*Q的矩阵或1*Q的cell向量,U为标签种类数,Q为批次数,输入该变量时一定要注意行列方向是否正确
3.实现BP分类
分类的一般实现方法在文件夹中的demoBPclass文件中有所展示,代码分为导入数据和调用函数两步。用户只需要将导入数据部分换成自己的导入程序,再设置好调用函数的入口参数即可。
其中大部分参数设置方法在注释中都有所介绍,不过其中的set需要额外说明一下:
set中目前可以设置的属性包括trainFcn和transferFcn、epochs三种,分别代表神经网络的训练函数和激活函数、最大迭代次数。trainFcn和transferFcn可选的属性以及相应的描述如下:
trainFcn
trainscg(默认):比例共轭梯度方向传播
trainbfg:BFGS准牛顿反向传播
traincgb:具有Powell-Beale重启的共轭梯度方向传播
traincgf:具有Fletcher-Reeves更新的共轭梯度反向传播
traincgp:具有Polak-Ribiére更新的共轭梯度反向传播
traingda:自适应学习速率方向传播的梯度下降
traingdm:动量方向传播的梯度下降
traingdx:动量梯度下降和自适应学习速率反向传播
trainlm:Levenberg-Marquardt反向传播
trainoss:一步割线反向传播
trainrp:弹性反向传播
transferFcn
logsig
Log-sigmoid转移函数,表达式:
logsig(n) = 1 / (1 + exp(-n))

tansig
表达式:
a = tansig(n) = 2/(1+exp(-2*n))-1

poslin(就是ReLU)
表达式:poslin(n) = n, if n >= 0 = 0, if n <= 0
运行程序即可。
四、关于完整版与公开版代码
功能 | 公开版 | 完整版 |
数据导入、参数设置、实现分类 | √ | √ |
软件全部源码(函数m文件) | p* | m* |
绘图无水印 | × | √ |
最大迭代次数 | 5 | 无限制 |
可导出训练好的网络net | × | √ |
*p文件可以被调用,但无法查看代码,m文件可以查看源码并自由修改
五、获取公开版程序(需使用电脑浏览器打开)
Bp网络实现分类公开版代码
注:公开版代码需使用MATLAB2022a及以上版本
六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)
获取通道一(淘宝):点击此处获取完整版程序
获取通道二(本页面):点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式~本通道处于测试阶段,使用该通道可以额外优惠(仅需39元)。付款完成后刷新一下本页面即可看到下载链接。
(注意支付跳转失败的话,请使用浏览器打开本页面)
七、重要更新
20240429 重要更新,进一步完善代码,丰富了注释,并将公开版代码也同步更新到新架构。
20240323 重要更新,重构了代码,现在代码可以以cell类型的字符串为标签。另外增加了混淆矩阵绘图以及测试集真是类别与预测类别对比图。
20200504 完成初版代码