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元)。付款完成后刷新一下本页面即可看到下载链接。

您需要先支付 39元 才能查看此处内容!立即支付

七、重要更新

20240429 重要更新,进一步完善代码,丰富了注释,并将公开版代码也同步更新到新架构。

20240323 重要更新,重构了代码,现在代码可以以cell类型的字符串为标签。另外增加了混淆矩阵绘图以及测试集真是类别与预测类别对比图。

20200504 完成初版代码