一个简单的BP神经网络matlab程序(附函数详解)
说明:20180604更新
1、此文的程序来自博客:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html
2、本人对其中涉及到的函数进行了详细说明。
3、此程序中部分函数的使用方式是高版本Matlab中不推荐的
文中给出了当前高版本Matlab中的使用方式,并给出了相关博客地址,具体如下:
归一化方式mapminmax : http://blog.csdn.net/lkj345/article/details/50352385
newff函数的使用: http://www.cnblogs.com/xxfcz/p/4482813.html
4、使用过程中,可能出现的问题
https://blog.csdn.net/ckzhb/article/details/78615712
5、所需的IRIS数据集
https://download.csdn.net/download/ckzhb/10458430
https://github.com/xiaoxiaoxiaohui/Resource/tree/master/水仙花数据集
具体程序如下:
%读取训练数据
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);%特征值归一化
[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]') ;%构造输出矩阵
s = length( class) ;
output = zeros( s , 3 ) ;
for i = 1 : s output( i , class( i ) ) = 1 ;
end%创建神经网络
net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ; %设置训练参数
net.trainparam.show = 50 ;
net.trainparam.epochs = 500 ;
net.trainparam.goal = 0.01 ;
net.trainParam.lr = 0.01 ;%开始训练
net = train( net, input , output' ) ;%读取测试数据
[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);%测试数据归一化
testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;%仿真
Y = sim( net , testInput ) %统计识别正确率
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2[m , Index] = max( Y( : , i ) ) ;if( Index == c(i) ) hitNum = hitNum + 1 ; end
end
sprintf('识别率是 %3.3f%%',100 * hitNum / s2 )
详细说明:
1、文本文件读取函数
textread() 读取文件中数据,%f表示读取单浮点数,按列依次将数据存入f1、f2、f3……。这里f1—f4代表四个特征,class代表每组数据所属的类别。
这里的每列是一个属性/特征的所有输入值,并不是后面函数中输入的一组样本数据。
而在程序中 premnmx、newff、train、tramnmx都是以列的形式输入每组样本数据,故在归一化时需要转置。
2、归一化处理函数
premnmx()将原始数据归一化到-1到1之间,该函数在高版本的MATLAB中已被废弃。
[input,minI,maxI] = premnmx(P)
premnmx()对行归一化,故需要将textread读取的原始数据进行转置,此时矩阵P是4行75列的(4个属性,75组训练样本)。
minI,maxI均是4行1列,这两个是为了后面的测试数据的归一化。
input是归一化后的矩阵4行75列。后面神经网络创建的newff函数的第一个参数是一个Rx2的矩阵以定义R个输入向量(即输入层节点个数-输入特征值个数)的最小值和最大值。
推荐使用mapminmax进行归一化:该函数也是对行归一化!!!
http://blog.csdn.net/lkj345/article/details/50352385
https://blog.csdn.net/ckzhb/article/details/72871140
例子:[inputn,setting]=mapminmax(input_train);
3、输出矩阵
%构造输出矩阵
s = length( class ) ;
output = zeros( s , 3 ) ; %zeros(s,3)生成s乘3的全零阵。即75行3列
for i = 1 : soutput( i , class( i ) ) = 1 ;
end
output是75行3列。class矩阵是75行1列,前几列是1,中间是2,最后是3.(即三种花的类型)。数据集中第一种花标记为1,第二种花记为2,第三种花记为3,这样经过循环后,output依然是75行3列,第一列的前几行全为1,第二列的中间几行全为1,第三列的最后几行全为1,其余均为0.
目的是:神经网络输出需要根据类别数量进行一定的处理,有几种类别输出层便含有几个结点,即第一种花输出为[1 0 0],第二种花输出为[0 1 0],第三种花输出为[0 0 1]。这里output每一行对应一组样本的输出类别,通过一个for循环,将所述的类所在的列置为1,此时output是75行3列的。后续train()函数所需的输出标签要求每一列对应一组数据的类别,故后续需要将output转置。
4、神经网络构建
net = newff( minmax(input) ,[10 3] , { 'logsig' 'purelin' } , 'traingdx' )
(此例是老版本的使用http://blog.sina.com.cn/s/blog_64b046c70101cko4.html)
旧版newff函数的格式为:
net=newff(PR,[S1S2 ...SN],{TF1 TF2...TFN},BTF,BLF,PF),函数newff建立一个可训练的前馈网络。输入参数说明:
PR:Rx2的矩阵以定义R个输入向量的最小值和最大值;
Si:第i层神经元个数;
TFi:第i层的传递函数,默认函数为tansig函数;
BTF:训练函数,默认函数为trainlm函数;
traingdx表示学习率自适应并附加动量因子的最速下降法
BLF:权值/阈值学习函数,默认函数为learngdm函数;
PF:性能函数,默认函数为mse函数。
minmax()函数用于获取数组中每一行的最小值和最大值
新版newff函数格式:
net =newff(P,T,[S1 S2...S(N-l)],{TF1 TF2...TFNl}, BTF,BLF,PF,IPF,OPF,DDF)
例如:net=newff(inputn,output_train,6,{'tansig','purelin'},'traingda');
P和T:输入和输出矩阵;每一列代表一组样本数据。
Si:第i层神经元个数,输出层不用写,根据T决定;
TFi:第i层的传递函数,隐含层默认函数为tansig函数,输出层默认为’purelin’;
BTF:训练函数,默认函数为trainlm函数,表示采用LM法进行训练;
BLF:权值/阈值学习函数,默认函数为learngdm函数;
PF:性能函数,默认函数为mse函数即均方误差。
IPF:指定输入数据归一化函数的细胞数组。
OPF:指定输出数据反归一化函数的细胞数组
DDF:数据划分函数。
(后5个一般用不到)
旧版本:旧用法训练次数多,但精度高
新版本:新用法训练次数少,但精度可能达不到要求
造成上述原因是:
程序里面的权值、阈值的初始值是随机赋值的,所以每次运行的结果都会不一样,有好有坏。
你可以把预测效果不错的网络的权值和阈值作为初始值。
具体可以查看net.iw{1,1}、net.lw{2,1}、net.b{1,1}、net.b{2,1}的值。
5、训练函数
net = train( net, input ,output' ) ;
这里input是4行75列,output经转置后是3行75列。
即每组数据是以列的形式输入到构建的神经网络模型,共75组。相应的,输出层与之对应,组数保持一致。
6、测试
Y = sim( net, testInput )
sim仿真,Y是训练好的网络net对输入testInput的实际输出。
若使用mapminmax()函数,测试数据归一化方法为:inputn_test=mapminmax('apply',input_test,setting);
一个简单的BP神经网络matlab程序(附函数详解)相关推荐
- 主成分分析(PCA)——matlab程序及函数详解
参考来源: http://www.cnblogs.com/Hand-Head/articles/5156435.html http://www.matlabsky.com/thread-11751-1 ...
- matlab中xcorr函数详解
Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...
- Matlab中 pdist 函数详解
学习笔记,仅供参考,有错必纠 转载自:Matlab中 pdist 函数详解(各种距离的生成); pdist Pairwise distance between pairs of objects. Sy ...
- MATLAB的iptcheckinput函数详解
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 iptcheckinput函数详解,这个函数在看 ...
- MATLAB的iptchecknargin函数详解
iptchecknargin函数详解,这个函数在看别人写的M函数时很有用! ipt是image process tools,即图像处理工具的缩写,MALAB里边有一个图像像处理工具箱,里边有一组函数的 ...
- MATLAB从入门到精通:搭建一个 简单的Bp神经网络(附代码)
01 | 构建数据集 构造一个1行1000列的一维矩阵,这1000个数全部都在(0,1)这个区间内.规定当某一列的数字大于等于0.5时,输出为1,否则输出-1.构造数据集的代码如下. %% 构造数据集 ...
- 使用python自己搭建一个简单的BP神经网络
from numpy import exp,array,random,dot #import randomclass NeuralNetwork(object):def __init__(self): ...
- 一个简单的BP神经网络例子
原创文章,转载请说明来自<老饼讲解神经网络>:bp.bbbdata.com 关于<老饼讲解神经网络>: 本网结构化讲解神经网络的知识,原理和代码. 重现matlab神经网络工具 ...
- matlab自带SVM算法例子(附函数详解)
一.程序 SVM理论的学习,见文章:http://blog.csdn.net/ckzhb/article/details/68941695 load fisheriris ...
最新文章
- Spring MVC实现上传文件报错解决方案
- 操作系统第四章-文件管理
- SAP SHD0的详细简介
- TO C AND TO B IN TERMS OF CUSTOMER
- C语言标准时间与日期函数
- 深度学习面试基础--BN层
- 服务器显示器超频,电脑显示器超频怎么恢复正常 电脑显示器超频是什么原因...
- 美国大学计算机专业排名 圣地亚哥,U.S.News美国大学计算机专业排名
- HDFS数据加密空间--Encryption zone
- 点歌机显示歌库服务器未能连接,快速解决常见的六种KTV点歌设备突发故障
- 2017东北四省赛G题
- 自动驾驶寻找「商业闭环」
- macOS SwiftUI 指示器组件规范之 02 评级指标 Rating Indicators
- Timeline 时间线基础用法
- 微信自定义分享卡片链接的解决方案(可自定义标题 描述 缩列图)
- Android Studio中 安卓模拟器不能联网的解决方案
- Word文档目录自动生成和页码设置
- QML Repeater
- 《AutoCAD 2014中文版实用教程》一一1.2 标题栏
- php100以内合数,3D须知工具众览:和差对照表 最稳定组合 质合数 和值跨度
热门文章
- mysql.8.0.13ZIP安装教程_关于mysql 8.0.13zip包安装方法
- 微服务和分布式的区别_大话中台三:中台的搭建,分布式与微服务
- 计算机通信基础ppt,计算机网络第2章 数据通信基础知识要点课件.ppt
- QDataStream 多余字符的产生原因及消除方法
- 清理Visual Studio最近打开的项目、文件、查找内容和最近引用组件
- [Hadoop in China 2011] 淘宝OceanBase打造结构化NoSQL数据库
- Spring系统学习--20180613:Spring的AOP开发说明
- Linux自动解压部署WEB项目脚本
- 分享一篇SCCM软件更新的故障排除
- 搜索结果红色php,.NET_asp.net搜索匹配关键字为红色显示的代码,首先创建类库 Model (业务实体 - phpStudy...