神经网络-matlab使用方法

http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html
https://blog.****.net/sinat_38321889/article/details/79182832

例子
代码


P=[3.2 3.2 3 3.2 3.2 3.4 3.2 3 3.2 3.2 3.2 3.9 3.1 3.2;   
9.6 10.3 9 10.3 10.1 10 9.6 9 9.6 9.2 9.5 9 9.5 9.7;
3.45 3.75 3.5 3.65 3.5 3.4 3.55 3.5 3.55 3.5 3.4 3.1 3.6 3.45;
2.15 2.2 2.2 2.2 2 2.15 2.14 2.1 2.1 2.1 2.15 2 2.1 2.15;
140 120 140 150 80 130 130 100 130 140 115 80 90 130;
2.8 3.4 3.5 2.8 1.5 3.2 3.5 1.8 3.5 2.5 2.8 2.2 2.7 4.6;
11 10.9 11.4 10.8 11.3 11.5 11.8 11.3 11.8 11 11.9 13 11.1 10.85;
50 70 50 80 50 60 65 40 65 50 50 50 70 70];

T=[2.24 2.33 2.24 2.32 2.2 2.27 2.2 2.26 2.2 2.24 2.24 2.2 2.2 2.35;];

[p1,minp,maxp,t1,mint,maxt]=premnmx(P,T);%按行进行归一化
%创建网络
net=newff(minmax(P),[3,1],{'logsig','purelin'},'trainlm');%purelin
%设置训练次数
net.trainParam.epochs = 10000;
%设置收敛误差
net.trainParam.goal=0.0000001;
% 学习速率
net.trainParam.lr=0.001;
%训练网络
[net,tr]=train(net,p1,t1);
 
%输入检测数据
a=[3.0;9.3;3.3;2.05;100;2.8;11.2;50];
%将输入数据归一化
a=premnmx(a);
%放入到网络输出数据
b=sim(net,a);
%将得到的数据反归一化得到预测数据
c=postmnmx(b,mint,maxt);
c
  1. 准备数据
    学习样本P,相同特征量放在同一行,相同样本放在同一列
    样本的参考结果T,相同特征量放在同一行,相同样本放在同一列
  2. 归一化处理,
    目的:
    <1>输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
    <2>数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。
    <3>由于神经网络输出层的**函数的值域是有限制的,因此需要将网络训练的目标数据映射到**函数的值域。例如神经网络的输出层若采用S形**函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
    <4>S形**函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X)在参数a=1时,f(100)与f(5)只相差0.0067

https://wenku.baidu.com/view/5453cde84afe04a1b071de21.html

Matlab中归一化处理数据可以采用premnmx , postmnmx , tramnmx 这3个函数。

<1> premnmx
语法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)
参数:
pn: p矩阵按行归一化后的矩阵
minp,maxp:p矩阵每一行的最小值,最大值
tn:t矩阵按行归一化后的矩阵
mint,maxt:t矩阵每一行的最小值,最大值
作用:将矩阵p,t归一化到[-1,1] ,主要用于归一化处理训练数据集。

<2> tramnmx
语法:[pn] = tramnmx(p,minp,maxp)
参数:
minp,maxp:premnmx函数计算的矩阵的最小,最大值
pn:归一化后的矩阵
作用:主要用于归一化处理待分类的输入数据。

<3> postmnmx
语法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)
参数:
minp,maxp:premnmx函数计算的p矩阵每行的最小值,最大值
mint,maxt:premnmx函数计算的t矩阵每行的最小值,最大值
作用:将矩阵pn,tn映射回归一化处理前的范围。postmnmx函数主要用于将神经网络的输出结果映射回归一化前的数据范围。

  1. 创建网络
    net=newff(minmax§,[3,1],{‘logsig’,‘purelin’},‘trainlm’);%purelin

<1>newff函数语法 newff函数参数列表有很多的可选参数,具体可以参考Matlab的帮助文档,这里介绍newff函数的一种简单的形式。
语法:
net = newff ( A, B, {C} ,‘trainFun’)
参数:
A:一个n×2的矩阵,第i行元素为输入信号xi的最小值和最大值;
B:一个k维行向量,其元素为网络中各层节点数;
C:一个k维字符串行向量,每一分量为对应层神经元的**函数;
trainFun :为学习规则采用的训练算法。

<2>常用的**函数有:   
https://blog.****.net/vivian_ll/article/details/78496944
https://blog.****.net/kangyi411/article/details/78969642
常用**函数比较
浅谈深度学习中的**函数
深度学习中的**函数导引

a) 线性函数 (Linear transfer function)
f(x) = x   
该函数的字符串为’purelin’。

b) 对数S形转移函数( Logarithmic sigmoid transfer function )
神经网络-matlab使用方法
在sigmod函数中我们可以看到,其输出是在(0,1)这个开区间内,这点很有意思,可以联想到概率,但是严格意义上讲,不要当成概率。sigmod函数曾经是比较流行的,它可以想象成一个神经元的放电率,在中间斜率比较大的地方是神经元的敏感区,在两边斜率很平缓的地方是神经元的抑制区。

当然,流行也是曾经流行,这说明函数本身是有一定的缺陷的。

  1. 当输入稍微远离了坐标原点,函数的梯度就变得很小了,几乎为零。在神经网络反向传播的过程中,我们都是通过微分的链式法则来计算各个权重w的微分的。当反向传播经过了sigmod函数,这个链条上的微分就很小很小了,况且还可能经过很多个sigmod函数,最后会导致权重w对损失函数几乎没影响,这样不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散。
  2. 函数输出不是以0为中心的,这样会使权重更新效率降低。对于这个缺陷,在斯坦福的课程里面有详细的解释。
  3. sigmod函数要进行指数运算,这个对于计算机来说是比较慢的。

该函数的字符串为’logsig’:logsig(n)=1/(1+exp(-n))
导函数: d logsig(n)=-exp(-n)/(1+exp(-n))^2=logsig(n)(1-logsig(n))

c) 双曲正切S形函数 (Hyperbolic tangent sigmoid transfer function )
神经网络-matlab使用方法
tanh是双曲正切函数,tanh函数和sigmod函数的曲线是比较相近的,咱们来比较一下看看。首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。

一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数。不过这些也都不是一成不变的,具体使用什么**函数,还是要根据具体的问题来具体分析,还是要靠调试的。

该函数的字符串为’ tansig’:
  tansig(n)=2/(1+exp(-2*n)) -1;

Matlab的安装目录下的toolbox\nnet\nnet\nntransfer子目录中有所有**函数的定义说明。
  
输出层一般采用
logsig purelin
隐含层采用
tansig logsig

<3>常见的训练函数:
https://blog.****.net/durpur/article/details/42364917
traingd :梯度下降BP训练函数(Gradient descent backpropagation)
traingdx :梯度下降自适应学习率训练函数

1.traingd:批梯度下降训练函数,沿网络性能参数的负梯度方向调整网络的权值和阈值.

2.traingdm:动量批梯度下降函数,也是一种批处理的前馈神经网络训练方法,不但具有更快的收敛速度,而且引入了一个动量项,有效避免了局部最小问题在网络训练中出现.

3.trainrp:有弹回的BP算法,用于消除梯度模值对网络训练带来的影响,提高训练的速度.(主要通过delt_inc和delt_dec来实现权值的改变)

4.trainlm:Levenberg-Marquardt算法,对于中等规模的BP神经网络有最快的收敛速度,是系统默认的算法.由于其避免了直接计算赫赛矩阵,从而减少了训练中的计算量,但需要较大内存量.

5.traincgb:Plwell-Beale算法:通过判断前后梯度的正交性来决定权值和阈值的调整方向是否回到负梯度方向上来.

6.trainscg:比例共轭梯度算法:将模值信赖域算法与共轭梯度算法结合起来,减少用于调整方向时搜索网络的时间.

一般来说,traingd和traingdm是普通训练函数,而traingda,traingdx,traingd,trainrp,traincgf,traincgb,trainscg,trainbgf等等都是快速训练函数.总体感觉就是训练时间的差别比较大,还带有精度的差异.

<4>网络配置参数如下:

net.trainparam.goal :神经网络训练的目标误差
net.trainparam.show : 显示中间结果的周期
net.trainparam.epochs  :最大迭代次数
net.trainParam.lr : 学习率