一个简单的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代表每组数据所属的类别。

这里的每列是一个属性/特征的所有输入值,并不是后面函数中输入的一组样本数据。

而在程序中 premnmxnewfftraintramnmx都是以列的形式输入每组样本数据,故在归一化时需要转置

 

2、归一化处理函数

premnmx()将原始数据归一化到-1到1之间,该函数在高版本的MATLAB中已被废弃。

[input,minI,maxI] = premnmx(P)

premnmx()对归一化,故需要将textread读取的原始数据进行转置,此时矩阵P是4行75列的(4个属性,75组训练样本)。

minI,maxI均是4行1列,这两个是为了后面的测试数据的归一化。

input是归一化后的矩阵475列。后面神经网络创建的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 : s
   output( 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建立一个可训练的前馈网络。输入参数说明:

PRRx2矩阵以定义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);
 

 

 

相关推荐
【目录】- MATLAB神经网络30个案例分析(开发实例系列图书) 第1章 BP神经网络的数据分类——语音特征信号分类1 本案例选取了民歌、古筝、摇滚和流行四类不同音乐,用BP神经网络实现对这四类音乐的有效分类。 第2章 BP神经网络的非线性系统建模——非线性函数拟合11 本章拟合的非线性函数为y=x21+x22。 第3章 遗传算法优化BP神经网络——非线性函数拟合21 根据遗传算法和BP神经网络理论,在MATLAB软件中编程实现基于遗传算法优化的BP神经网络非线性系统拟合算法。 第4章 神经网络遗传算法函数极值寻优——非线性函数极值寻优36 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性寻优能力寻找函数极值。 第5章 基于BP_Adaboost的强分类器设计——公司财务预警建模45 BP_Adaboost模型即把BP神经网络作为弱分类器,反复训练BP神经网络预测样本输出,通过Adaboost算法得到多个BP神经网络弱分类器组成的强分类器。 第6章 PID神经元网络解耦控制算法——多变量系统控制54 根据PID神经元网络控制器原理,在MATLAB中编程实现PID神经元网络控制多变量耦合系统。 第7章 RBF网络的回归——非线性函数回归的实现65 本例用RBF网络拟合未知函数,预先设定一个非线性函数,如式y=20+x21-10cos(2πx1)+x22-10cos(2πx2)所示,假定函数解析式不清楚的情况下,随机产生x1,x2和由这两个变量按上式得出的y。将x1,x2作为RBF网络的输入数据,将y作为RBF网络的输出数据,分别建立近似和精确RBF网络进行回归分析,并评价网络拟合效果。 第8章 GRNN的数据预测——基于广义回归神经网络的货运量预测73 根据货运量影响因素的分析,分别取国内生产总值(GDP),工业总产值,铁路运输线路长度,复线里程比重,公路运输线路长度,等级公路比重,铁路货车数量和民用载货汽车数量8项指标因素作为网络输入,以货运总量,铁路货运量和公路货运量3项指标因素作为网络输出,构建GRNN,由于训练数据较少,采取交叉验证方法训练GRNN神经网络,并用循环找出最佳的SPREAD。 第9章 离散Hopfield神经网络的联想记忆——数字识别81 根据Hopfield神经网络相关知识,设计一个具有联想记忆功能的离散型Hopfield神经网络。要求该网络可以正确地识别0~9这10个数字,当数字被一定的噪声干扰后,仍具有较好的识别效果。 第10章 离散Hopfield神经网络的分类——高校科研能力评价90 某机构对20所高校的科研能力进行了调研和评价,试根据调研结果中较为重要的11个评价指标的数据,并结合离散Hopfield神经网络的联想记忆能力,建立离散Hopfield高校科研能力评价模型。 第11章 连续Hopfield神经网络的优化——旅行商问题优化计算100 现对于一个城市数量为10的TSP问题,要求设计一个可以对其进行组合优化的连续型Hopfield神经网络模型,利用该模型可以快速地找到最优(或近似最优)的一条路线。 第12章 SVM的数据分类预测——意大利葡萄酒种类识别112 将这178个样本的50%做为训练集,另50%做为测试集,用训练集对SVM进行训练可以得到分类模型,再用得到的模型对测试集进行类别标签预测。 第13章 SVM的参数优化——如何更好的提升分类器的性能122 本章要解决的问题就是仅仅利用训练集找到分类的最佳参数,不但能够高准确率的预测训练集而且要合理的预测测试集,使得测试集的分类准确率也维持在一个较高水平,即使得得到的SVM分类器的学习能力和推广能力保持一个平衡,避免过学习和欠学习状况发生。 第14章 SVM的回归预测分析——上证指数开盘指数预测133 对上证指数从1990.12.20-2009.08.19每日的开盘数进行回归分析。 第15章 SVM的信息粒化时序回归预测——上证指数开盘指数变化趋势和变化空间预测141 在这个案例里面我们将利用SVM对进行模糊信息粒化后的上证每日的开盘指数进行变化趋势和变化空间的预测。 若您对此书内容有任何疑问,可以凭在线交流卡登录中文论坛与作者交流。 第16章 自组织竞争网络在模式分类中的应用——患者癌症发病预测153 本案例中给出了一个含有60个个体基因表达水平的样本。每个样本中测量了114个基因特征,其中前20个样本是癌症病人的基因表达水平的样本(其中还可能有子类), 中间的20个样本是正常人的基因表达信息样本, 余下的20个样本是待检测的样本(未知它们是否正常)。以下将设法找出癌症与正常样本在基因表达水平上的区
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页