BP神经网络原理及matlab实现
一、简介
1、BP 神经网络的信息处理方式的特点
- 信息分布存储。
- 信息并行处理。
- 具有容错性。
- 具有自学习、自组织、自适应的能力。
2、BP神经网络的主要功能
- 函数逼近:用输入向量和相应的输出向量训练一个网络以逼近一个函数。
- 模式识别:用一个待定的输出向量将它与输入向量联系起来。
- 分类:把输入向量所定义的合适方式进行分类。
- 数据压缩:减少输出向量维数以便传输或存储。
二、神经网络的训练
1、神经网络拓扑结构(隐含层)的确定
一般认为,增加隐层数可以降低网络误差(也有文献认为不一定能有效降低),提高精度,但也使网络复杂化,从而增加了网络的训练时间和出现"过拟合"的倾向。
Hornik等早已证明:若输入层和输出层采用线性转换函数,隐层采用Sigmoid转换函数,则含一个隐层的MLP网络能够以任意精度逼近任何有理函数。显然,这是一个存在性结论。在设计BP网络时可参考这一点,应优先考虑3层BP网络(即有1个隐层)。
一般地,靠增加隐层节点数来获得较低的误差,其训练效果要比增加隐层数更容易实现。对于没有隐层的神经网络模型,实际上就是一个线性或非线性(取决于输出层采用线性或非线性转换函数型式)回归模型。
因此,一般认为,应将不含隐层的网络模型归入回归分析中,技术已很成熟,没有必要在神经网络理论中再讨论之。
在BP 网络中,隐层节点数的选择非常重要,它不仅对建立的神经网络模型的性能影响很大,而且是训练时出现“过拟合”的直接原因,但是目前理论上还没有一种科学的和普遍的确定方法。
目前多数文献中提出的确定隐层节点数的计算公式都是针对训练样本任意多的情况,而且多数是针对最不利的情况,一般工程实践中很难满足,不宜采用。事实上,各种计算公式得到的隐层节点数有时相差几倍甚至上百倍。为尽可能避免训练时出现“过拟合”现象,保证足够高的网络性能和泛化能力,确定隐层节点数的最基本原则是:在满足精度要求的前提下取尽可能紧凑的结构,即取尽可能少的隐层节点数。研究表明,隐层节点数不仅与输入/输出层的节点数有关,更与需解决的问题的复杂程度和转换函数的型式以及样本数据的特性等因素有关。
2、网络的初始连接权值
BP算法决定了误差函数一般存在(很)多个局部极小点,不同的网络初始权值直接决定了BP算法收敛于哪个局部极小点或是全局极小点。因此,要求计算程序(建议采用标准通用软件,如Statsoft公司出品的Statistica Neural Networks软件和Matlab 软件)必须能够自由改变网络初始连接权值。由于Sigmoid转换函数的特性,一般要求初始权值分布在 -0.5~0.5 之间比较有效。
3、网络模型的性能和泛化能力
训练神经网络的首要和根本任务是确保训练好的网络模型对非训练样本具有好的泛化能力(推广性),即有效逼近样本蕴含的内在规律,而不是看网络模型对训练样本的拟合能力。从存在性结论可知,即使每个训练样本的误差都很小(可以为零),并不意味着建立的模型已逼近训练样本所蕴含的规律。因此,仅给出训练样本误差(通常是指均方根误差RSME或均方误差、AAE或MAPE等)的大小而不给出非训练样本误差的大小是没有任何意义的。
4、调整参数对bp进行优化
BP网络的训练就是通过应用误差反传原理不断调整网络权值使网络模型输出值与已知的训练样本输出值之间的误差平方和达到最小或小于某一期望值。
由于BP网络采用误差反传算法,其实质是一个无约束的非线性最优化计算过程,在网络结构较大时不仅计算时间长,而且很容易限入局部极小点而得不到最优结果。目前虽已有改进BP法、遗传算法(GA)和模拟退火算法等多种优化方法用于BP网络的训练(这些方法从原理上讲可通过调整某些参数求得全局极小点),但在应用中,这些参数的调整往往因问题不同而异,较难求得全局极小点。这些方法中应用最广的是增加了冲量(动量)项的改进BP算法。
三、基于Matlab的BP网络实现
1、前向网络创建函数 newff
该函数用于创建一个BP网络。调用格式为:
net = newff
net = newff(PR,[S1 S2..SN1],{TF1 TF2..TFN1},BTF,BLF,PF)
其中,
- net=newff;用于在对话框中创建一个BP网络。
- net为创建的新BP神经网络;
- PR为网络输入向量取值范围的矩阵;
- [S1 S2…SNl]表示网络隐含层和输出层神经元的个数;
- {TFl TF2…TFN1}表示网络隐含层和输出层的传输函数,默认为‘tansig’;
- BTF表示网络的训练函数,默认为‘trainlm’;
- BLF表示网络的权值学习函数,默认为‘learngdm’;
- PF表示性能数,默认为‘mse’。
2、传递函数
1、logsig(sigmoid)
该传递函数为S型的对数函数。
y
=
log
s
i
g
(
x
)
=
1
1
+
e
−
x
y = \log sig(x) = \frac{1}{{1 + {e^{ - x}}}}
y=logsig(x)=1+e−x1
图像如下:
调用格式为:
A=logsig(N)
info=logsig(code)
其中,
-
N:Q个S维的输入列向量;
-
A:函数返回值,位于区间(0,1)
2、tansig
该函数为双曲正切S型传递函数。
y
=
tan
s
i
g
(
x
)
=
2
1
+
e
−
2
x
−
1
y = \tan sig(x) = \frac{2}{{1 + {e^{ - 2x}}}} - 1
y=tansig(x)=1+e−2x2−1
图像如下:
调用格式为:
A=tansig(N)
info=tansig(code)
其中,
-
N:Q个S维的输入列向量;
-
A:函数返回值,位于区间(-1,1)。
3、purelin
该函数为线性传递函数。
y
=
p
u
r
e
l
i
n
(
x
)
=
x
y=purelin(x)=x
y=purelin(x)=x
图像如下:
调用格式为:
A=purelin(N)
info=purelin(code)
4、poslin
该函数为正线性传递函数。
y
=
p
o
s
l
i
n
(
x
)
=
{
x
x
≥
0
0
x
<
0
y = poslin(x) = \left\{ \begin{array}{l} x\quad \quad x \ge {\rm{0}}\\ 0\quad \quad x < 0 \end{array} \right.
y=poslin(x)={xx≥00x<0
图像如下:
5、其他训练函数
-
traingdx:有动量和自适应lr的梯度下降法
-
trainlm Levenberg:Marquardt方法
-
traingd:梯度下降法
3、BP网络学习函数
1. learngd
该函数为梯度下降权值/阈值学习函数,它通过神经元的输入和误差,以及权值和阈值的学习效率,来计算权值或阈值的变化率。调用格式为:
[dW,ls]=learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
[db,ls]=learngd(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,LS)
info=learngd(code)
2. learngdm
函数为梯度下降动量学习函数,它利用神经元的输入和误差、权值或阈值的学习速率和动量常数,来计算权值或阈值的变化率。
4、BP网络训练与仿真
-
net=train(net,inputs, targets) %训练神经网络
-
simtest_y=sim(net,test_x) %对训练好的神经网络net进行仿真;test就是要拟合的,测试的话可以直接用input
5、数据预处理
常用函数:premnmx、tramnmx、postmnmx、mapminmax
(1)premnmx、tramnmx
- premnmx函数用于将网络的输入数据或输出数据进行归一化,归一化后的数据将分布在[-1,1]区间内。
premnmx语句的语法格式是: (其中P,T分别为原始输入和输出数据)
[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T)
- 在训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx函数:
tramnmx语句的语法格式是:(其中P和PN分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值)
[PN]=tramnmx(P,minp,maxp)
- 网络输出结果需要进行反归一化还原成原始的数据,常用的函数是postmnmx。
postmnmx语句的语法格式是:[PN] = postmnmx(P,minp,maxp)
其中P和PN分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。
(2)mapminmax:该函数可以把矩阵的每一行归一到[-1 1].
mapminmax语句的语法格式是:(其中x1 是需要归一的矩阵 y1是结果)
[y1,PS] = mapminmax(x1)
当需要对另外一组数据做归一时,就可以用下面的方法做相同的归一了
y2 = mapminmax('apply',x2,PS)
当需要把归一的数据还原时,可以用以下命令:
x1_again = mapminmax('reverse',y1,PS)
其中:pminp和maxp分别为P中的最小值和最大值。mint和maxt分别为T的最小值和最大值。
6、性能评价
平均绝对误差(MAE)
M
A
E
=
1
m
∑
j
=
1
m
∣
y
j
^
−
y
j
∣
MAE=\frac{{\rm{1}}}{m}\sum\limits_{j = 1}^m {\left| {\widehat {{y_j}} - {y_j}} \right|}
MAE=m1j=1∑m∣yj
−yj∣
平均绝对百分误差(MAPE)
M
A
P
E
=
1
m
∑
j
=
1
m
∣
y
j
^
−
y
j
y
j
∣
MAPE = \frac{{\rm{1}}}{m}\sum\limits_{j = 1}^m {\left| {\frac{{\widehat {{y_j}} - {y_j}}}{{{y_j}}}} \right|}
MAPE=m1j=1∑m∣∣∣∣yjyj
−yj∣∣∣∣
均方根误差(RMSE)
R
M
S
E
=
1
n
∑
i
=
1
n
(
y
j
^
−
y
j
)
2
RMSE = \sqrt {\frac{1}{n}\sum\limits_{i = 1}^n {{{(\widehat {{y_j}} - {y_j})}^2}} }
RMSE=n1i=1∑n(yj
−yj)2
相关系数(
R
2
R^2
R2)
R
2
=
[
∑
j
=
1
m
(
y
j
−
y
‾
)
(
y
j
^
−
y
‾
)
]
2
∑
j
=
1
m
(
y
j
−
y
‾
)
2
∑
j
=
1
m
(
y
j
^
−
y
‾
)
2
{R^2} = \frac{{{{\left[ {\sum\limits_{j = 1}^m {({y_j} - \overline y )(\widehat {{y_j}} - \overline y )} } \right]}^2}}}{{\sum\limits_{j = 1}^m {{{({y_j} - \overline y )}^2}} \sum\limits_{j = 1}^m {{{(\widehat {{y_j}} - \overline y )}^2}} }}
R2=j=1∑m(yj−y)2j=1∑m(yj
−y)2[j=1∑m(yj−y)(yj
−y)]2