【Python 3 数据分析与机器学习实战】 预测分析-BP神经网络模型

    BP网络(Back-Propagation Network)是1986年由Rumelhart 和 McCelland 为首的科学教小组提出的,是一种按误差逆向传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一,用于函数逼近、模型识别分类、数据压缩和时间欲裂预测等。

    BP网络又称反向传播神经网络,它是一种有监督的学习算法,具有很强的自适应、自学习、非线性映射能力,能较好地解决数据少、信息贫、不确定性问题,且不受非线性模型限制。一个典型的BP神经网络应包括三层:输入层、隐含层和输出层。各层之间全链接,同层之间无连接。隐含层可以有一层或者多层,对于一般的网络而言,单层的隐含层就够用了。下图所示为一个典型的三层神经网络结构图(只包含一个隐含层)。x是神经元输入,z是隐含层的输出,y是输出层的输出。

      【Python 3 数据分析与机器学习实战】 预测分析-BP神经网络模型

    BP神经网络的学习过程包括信号正向传播和误差反向传播两个阶段。

    (1)正向传播时,输入信号从输入层经各个隐含层向输出层传播,在输出层得到实际响应值,若实际值与期望值误差较大,就会转入误差反向传播阶段。

    (2)反向传播时,会按照误差梯度下降的方法从输出成各个隐含层并逐层不断地调整各神经元的连接权值和阈值,反复迭代,直到网络输出的误差减少到可以接受的程度,或者进行到预先设定的学习次数。

    BP神经网络通过有指导的学习方式进行训练和学习。标准的BP学习算法采用误差函数按梯度下降学习方法,是网络的实际输出值和期望输出值之间的均方误差最小。BP神经网络的传输函数常常采用sigmoid函数,而输入输出层则采用线性传输函数。其算法流程如下图所示。

                                                             【Python 3 数据分析与机器学习实战】 预测分析-BP神经网络模型

    1.网络结构设计

    (1)输入输出层设计

    输入层:输入层各神经元负责收来自外界的输入信息,并传递给中间层个神经元。它的节点数为输入变量的个数。

    输出层:输出层向外界输出星系处理结果。它的节点数为输出变量的个数。

    (2)隐含层设计

    隐含层:中间层是内部信息处理层,负责信息变换,根据信息变换能力的需求,中间层可设计为单隐含层或多隐含层结构,最后一个隐含层传递信息到输出层各神经元,经过进一步处理后,完成一次学习的正向传播处理过程。

    有关研究表明,一个隐含层的神经网络,只要隐节点足够多,就可以以任意精度逼近非线性函数。因此,通常采用含有一个隐层的三层多输入单输出的BP网络建立预测模型。在网络设计过程中,隐含层神经元数的确定十分重要。隐含层神经元个数过多,会加大网络计算量并容易产生过度拟合问题;神经元个数过少,则会影响网络性能,达不到预期效果。网络中隐含层神经元的数目与实际问题的复杂程度、输入和输出层的神经元数及对期望误差的设定有直接的联系。目前,对于隐层中神经元数目的确定并没有明确的公式,只有一些经验公式,神经元个数最终需要根据经验和多次实验来确定。常用的经验公式为:

                                                                                   【Python 3 数据分析与机器学习实战】 预测分析-BP神经网络模型

    其中,n为输入层神经元个数,m为输出层神经元个数,a为[1,10]之间的常数。

    2.BP算法的改进

    虽然BP神经网络具有高度非线性和较好的泛化能力,但也存在收敛速度慢、迭代步数多、易陷入局部极小和全局搜索能力差等缺点。可以采用增加动量项、自适应调节学习率、引用陡度因子等方法进行改进。

    (1)增加动量项

    引入动量项是为了加速算法收敛,即如下公式:

                                                    【Python 3 数据分析与机器学习实战】 预测分析-BP神经网络模型

    其中,动量因子【Python 3 数据分析与机器学习实战】 预测分析-BP神经网络模型一般为0.1~0.8。

    (2)自适应调节学习率

    (3)引入陡度因子

    通常BP神经网络在训练之前会对数据进行归一化处理, 即将数据映射到更小的区间内,如[0,1]或[-1,1]。