首页 > 学院 > 开发设计 > 正文

一个简单的BP神经网络matlab程序(附函数详解)

2019-11-06 06:51:15
字体:
来源:转载
供稿:网友

说明:

1、此文的程序来自博客:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html

2、本人对其中涉及到的函数进行了详细说明。

3、此程序部分使用函数方式是高版本Matlab中不推荐的,文中给出了当前高版本使用的方式,给出了相关博客地址。

归一化方式mapminmax :

http://blog.csdn.net/lkj345/article/details/50352385

newff函数的使用:

http://www.cnblogs.com/xxfcz/p/4482813.html

具体程序如下:

%读取训练数据[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 ;     endendsprintf('识别率是 %3.3f%%',100 * hitNum / s2 )

详细说明:

1、

textread() 读取文件中数据,%f表示读取单浮点数,按列分别送给f1、f2、f3……这里的每列是一个节点的所有输入值,并不是后面输入的一组数据。

而后面的premnmx、newff、train、tramnmx都是以列的形式输入每组数据,故需要转置

2、

premnmx()在高版本中被废弃了。归一化到-1到1之间。

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

矩阵P是4行75列的(4个属性,75组训练样本)

input是归一化后的矩阵4行75列。后面神经网络创建的newff函数的第一个参数是一个Rx2的矩阵以定义R个输入向量(即输入层节点个数-输入特征值个数)的最小值和最大值

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

 

推荐使用mapminmax进行归一化。

http://blog.csdn.net/lkj345/article/details/50352385

3、

zeros(s,3)生成s乘3的全零阵。即75行3列

%构造输出矩阵

s = length( class ) ;

output = zeros( s , 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.

目的是:训练样本集的输出,把output转置后就是每一组数据的输出结果,共75组结果。

即训练样本中,第一种花输出为[1 0 0],第二种花输出为[0 1 0],第三种花输出为[0 0 1]。

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)

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}、net.b{2}的值。

5、

net = train( net, input ,output' ) ;

这里input是4行75列,output经转置后是3行75列。

即每组数据是以列的形式输入到输入层,共75组。相应的,输出层与之对应,组数保持一致。

6、Y = sim( net, testInput )

sim仿真,Y是训练好的网络net对输入testInput的实际输出。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表