用Matlab创建BP神经网络

前言

最近在自学吴恩达的机器学习,还有学校的数据挖掘课程。课程结课设计要求剖析一个分类器程序,这是我在网上找的一篇文章(ANN神经网络入门——分类问题(MATLAB)     https://blog.csdn.net/u012321457/article/details/79273702),我这篇主要是要介绍代码其中函数的用法。

%读取训练数据
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);    %建议不要使用textread,请改用textscan

%特征值归一化
%[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]') ;    %premnmx is an obsolete function. use mapminmax instead.
[input,ps] = mapminmax([f1,f2,f3,f4]',0,1);

%构造输出矩阵
s = length(class);
output = zeros(s ,3);
for i = 1 : s
   output( i , class( i )  ) = 1 ;    %将类别1、2、3构造成[1 0 0]'  [0 1 0]'  [0 0 1]'
end

%创建神经网络
%net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } ,  'traingdx' ) ; 
% Obsoleted in R2010b NNET 7.0.  Last used in R2010a NNET 6.0.4.The recommended function is feedforwardnet.
net = feedforwardnet(10,'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 );  %tramnmx is an obsolete function. use mapminmax instead.
testInput = mapminmax('apply',[t1,t2,t3,t4]',ps);

%仿真
Y = sim( net , testInput);     %对输入的特征数据输出分类结果

%统计识别正确率
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2
    [m , Index] = max( Y( : ,i)) ;    %获取输出矩阵Y每一列中的最大值及下标
    if( Index  == c(i)   )
        hitNum = hitNum + 1 ;
    end
end
sprintf('识别率是 %3.3f%%',100 * hitNum / s2 )

运行结果:

newff()函数

newff函数的格式为:

        net=newff(PR,[S1 S2 ...SN],{TF1 TF2...TFN},BTF,BLF,PF),函数newff建立一个可训练的前馈网络。输入参数说明:

        PR:Rx2的矩阵以定义R个输入向量的最小值和最大值;

        Si:第i层神经元个数;

        TFi:第i层的传递函数,默认函数为tansig函数;

        BTF:训练函数,默认函数为trainlm函数;

        BLF:权值/阀值学习函数,默认函数为learngdm函数;

        PF:性能函数,默认函数为mse函数。

 

         TF

         purelin  线性传递函数 

        hardlim  硬限幅传递函数 

         hardlims  对称硬限幅传递函数 

         satlin  饱和线性传递函数 

         satlins  对称饱和线性传递函数 

         logsig  对数S 形传递函数 

         tansig  正切S 形传递函数 

        radbas  径向基传递函数 

        compet  竞争层传递函数 

 

        BTF

        trainlm  : 中型网络,内存需求最大,收敛速度最快

        traingd :梯度下降BP训练函数(Gradient descent backpropagation)

        traingdx :梯度下降自适应学习率训练函数

        traingdm:动量BP算法。 

        trainda:学习率可变的最速下降BP算法。 

        trainrp:弹性算法。 

        trainb :以权值/阈值的学习规则采用批处理的方式进行训练的函数

        trainc :以学习函数依次对输入样本进行训练的函数;

        trainr :以学习函数随机对输入样本进行训练的函数.

       变梯度算法: 

         traincgf(Fletcher-Reeves修正算法) 

         traincgp(Polak_Ribiere修正算法) 

            traincgb(Powell-Beale复位算法) 

         trainbfg(BFGS 拟牛顿算法) 

         trainoss(OSS算法)

        网络配置参数

        一些重要的网络配置参数如:

        net.trainparam.goal     :神经网络训练的目标误差

        net.trainparam.show   : 显示中间结果的周期

        net.trainparam.epochs  :最大迭代次数

        net.trainParam.lr              : 学习率

feedforwardnet()函数

        feedforward网络可以用作输入和输出的映射,若给予足够的隐藏神经元,两(或更多)层前馈网络可以实现任何有限的输入输出功能,只含有一个隐含层的的神经网络可以拟合任意有限的输入输出映射问题

语法:   

            feedforwardnet(hiddenSizes,trainFcn)

hiddenSizes:隐藏层神经元个数(一个行向量),默认值10

trainFcn:用于训练网络性能所采用的函数,默认'trainlm'

%matlab中自带例子
[x,t] = simplefit_dataset;
net = feedforwardnet(10);
net = train(net,x,t);
view(net)
y = net(x);
perf = perform(net,y,t)

train()函数

        网络训练学习函数

语法:[ net, tr, Y1, E ]  = train( net, X, Y )

参数:

X:网络实际输入

Y:网络应有输出

tr:训练跟踪信息

Y1:网络实际输出

E:误差矩阵

sim()函数

        使用网络进行仿真

语法:Y=sim(net,X)

参数:

net:网络

X   :输入给网络的K×N矩阵,其中K为网络输入(输入层)个数,N为数据样本数

Y   :输出矩阵Q×N,其中Q为网络输出(输出层)个数

数据集及源码下载链接: https://pan.baidu.com/s/1xMwGHKE_2witGVq6i2BnLg 提取码: 7ku5 

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页