本文是学习B站老哥数学建模课程之后的一点笔记。
BP(back propagation)算法神经网络的简单原理
BP神经网络是一种采用BP学习算法(按照误差逆向传播训练)的多层前馈神经网络,是应用最广泛的神经网络。
神经网络基本结构如下:
共分为三层,可以理解为一组输入数据,在隐藏层中进行各种复杂的处理,然后在输出层输出,生成输出数据。
输入神经元的个数为因子个数(指标个数),隐藏神经元的个数一般为因子的2~3倍,输出神经元的个数根据实际需输出情况来定。
如上图三层之间的连线箭头都代表着权重,不论是线性或者非线性,还是其他什么复杂的关系,各层间的数据都由权重来搭建关系网络,目的是模拟大脑对信息的处理过程。
神经网络的本质就是进行数据的拟合,工作状态分为学习和工作两种状态,即训练和仿真两个步骤。
在训练阶段,给出输入数据与正确的输出数据,神经网络根据输入数据进行复杂的运算得出实际的输出数据,实际的输出数据与正确的输出数据之间的差别就叫做误差,
而BP算法就是会反向传播误差一层一层不断修正各层神经元之间的连接权值,正所谓信号的正向传播和误差的反向传播,直到误差在规定的范围内或运行次数达到规定的学习次数,
此时结束算法,否则选取下一个学习样本及对应的期望输出,返回进入下一轮学习。
仿真阶段,在经过训练阶段的大量样本数据训练之后,神经网络已经较为准确,输入数据,运行得出输出数据,此即为预测过程。
BP网络的训练就是通过应用误差反传原理不断调整网络权值,使网络模型输出值与已知的训练样本输出值之间的误差平方和达到最小或小于某一期望值的过程。
基本运用
1.拟合——>进行数据的预测
2.分类(包含评价)——>聚类分析
注意:运用神经网络的场景一定要样本数量很多的,不然训练会不准确,以下代码只是为了展示效果。
编程步骤
(1)寻找对结果产生影响的各种指标,假设有m个。
(2)寻找样本n个,构造矩阵m*n,其对应的标准输出是n*1。
(3) 将上述m*n与n*1分别带入网络中训练,类似于下列代码中的P与T。
(4)输入新的数据进行仿真,类似于下列代码中的P2。
代码示例
clear; clc; P=[-1 -1 2 2 4;0 5 0 5 7];%两个指标,五个样本数 T=[-1 -1 1 1 -1]; %利用minmax函数求输入样本范围,归一化数据很重要,也可以用premnmx函数如[P,minp,maxp,T,mint,maxt]=premnmx(P,T); net = newff(minmax(P),[7,1],{\'tansig\',\'purelin\'},\'trainlm\'); %newff为创建网络函数
% [7 1]为隐层神经元个数和输出神经元个数,后面为各层之间的传输函数,以及修正神经网络的方法(反向传播的训练函数)
net.trainParam.show=50;%显示的间隔次数
net.trainParam.lr=0.05;%学习率设置,应设为较少值
net.trainParam.epochs=1000;%训练次数设置
net.trainParam.goal=1e-5;%训练目标精度设置
[net,tr]=train(net,P,T);%训练函数,参数为建立的神经网络,输入数据,输出数据
net.iw{1,1}%输入层到隐藏层权值
net.b{1}%隐藏层阈值
net.lw{2,1}%隐藏层到输出层权值
net.b{2}%输出层阈值
P2=[-1;2];%输入一个样本
y3=sim(net,P2);%计算仿真,根据输入数据预测输出数据
运行结果如图(R2017b),主要关注精度,时间,训练次数 的变化。
若训练结果不够准确,可更改传输函数和训练函数,以下为各训练函数,传输函数可自行百度
普通的神经网络算法有个最大的弊端,就是很有可能陷于局部最小值点,所以后来很多人提出了修正的神经网络算法(可跳过局部最小值点,找到真正的全局最小值点)。
更改上述训练函数即是修正了神经网络,在论文中如果对不同的修正神经网络算法进行比对,或者提到这一点可能会给论文增加优势。
原始数据与神经网络预测数据绘制曲线图进行比对,红色为预测数据,若不够准确可进行修正。
clear; clc; X=-1:0.1:1;%输入数据 D=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609... 0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988... 0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];%输出数据 figure; plot(X,D,\'*\'); %绘制原始数据分布图 net = newff(minmax(X),[5 1],{\'tansig\',\'tansig\'}, \'trainlm\');%生成BP网络 net.trainParam.epochs = 100; %训练的最大次数 net.trainParam.goal = 0.005; %全局最小误差 net = train(net,X,D); %网络训练 O = sim(net,X); %网络仿真 plot(X,D,X,O,\'r\'); %绘制训练后得到的结果和误差曲线 V = net.iw{1,1}%输入层到中间层权值 theta1 = net.b{1}%中间层各神经元阈值 W = net.lw{2,1}%中间层到输出层权值 theta2 = net.b{2}%输出层各神经元阈值
运行结果如图:
当然神经网络还可以用神经网络工具箱来运算,如图
若是多指标输入以及输出,可用BP神经网络算法来拟合它们之间的关系。
神经网络的应用很广泛,绝不止上面所提到的一点点内容,既然可以用它来预测数据,那么经过训练肯定也可以用来预测出不同的类别或者属性。
请发表评论