用BP神经网络实现任意非线性函数逼近(以sinx为例)
用BP神经网络实现任意非线性函数逼近(以sinx为例)
说明:本篇博客有关BP学习算法的一些相关知识点都来自上课的总结,除此之外,部分程序也参考了博主 麦克斯韦的妖精 的程序,博客链接如下,各位也可进行参考学习:
https://blog.csdn.net/john_bian/article/details/79503572?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-2-79503572.nonecase&utm_term=bp%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E9%80%BC%E8%BF%91sinx%E5%8E%9F%E7%90%86&spm=1000.2123.3001.4430
一、BP神经网络实现原理
误差反向传播神经网络,简称BP网络(Back Propagation),其基本思想是最小二乘算法,它采用梯度搜索技术,以期使网络的实际输出值与期望输出值的误差均方值为最小。是一种单向传播的多层前向网络。我们以三层BP神经网络为例,可以构建下图:
图中,xxx为输入数据,yyy为输出数据,iii为输入层,jjj为隐藏层,kkk为输出层, WjiW_{ji}Wji为隐含层权值,WkjW_{kj}Wkj为输出层权值,f(x)f(x)f(x)为神经元激励函数,BP算法常用sigmoidsigmoidsigmoid函数作为其激励函数。
为什么称其为误差反向传播神经网络?顾名思义,其参数的校准是通过反向传播一层层修改来实现的,但注意,这里的反向传播并不是说真正的有一条反向传播通路,而是通过校准输出层权值WkjW_{kj}Wkj,进而去校准隐含层权值WjiW_{ji}Wji,通过下面的相关公式大家可以进一步感悟。
1. BP网络权值的调整规则:
基于一阶梯度法的优化方法,有
E=12∑k=1L(dk−Ok)2E=\frac{1}{2}\sum_{k=1}^{L}(d_{k}-O_{k})^2E=21∑k=1L(dk−Ok)2
权系数应按EEE函数梯度变化的反方向进行调整,使网络的输出接近期望的输出。
2. BP网络的前馈计算:
(1)隐含层各神经元的净输入:
Ij=∑i=1mWjiOi−θjI_{j}=\sum_{i=1}^{m}W_{ji}O_{i}- \theta_{j}Ij=∑i=1mWjiOi−θj
隐含层各神经元的输出:
Oj=f1(Ij)O_{j}=f_{1}(I_{j})Oj=f1(Ij)
(2)输出层各神经元的净输入:
Ik=∑j=1qWkjOj−θkI_{k}=\sum_{j=1}^{q}W_{kj}O_{j}- \theta_{k}Ik=∑j=1qWkjOj−θk
输出层各神经元的输出:
Ok=f2(Ik)O_{k}=f_{2}(I_{k})Ok=f2(Ik)
3. BP网络的权值调整规则:
(1)输出层权系数的调整:
ΔWkj=−η∂E∂Wkj=ηδkOj\Delta W_{kj}=-\eta \frac{ \partial E}{ \partial W_{kj}}=\eta \delta_{k}O_{j}ΔWkj=−η∂Wkj∂E=ηδkOj
隐含层各神经元的输出:
δk=(dk−Ok)f2′(Ik)\delta_{k}=(d_{k}-O_{k})f^{'} _{2}(I_{k})δk=(dk−Ok)f2′(Ik)
(2)隐含层权系数的调整:
ΔWji=−η∂E∂Wji=ηδjOi\Delta W_{ji}=-\eta \frac{ \partial E}{ \partial W_{ji}}=\eta \delta_{j}O_{i}ΔWji=−η∂Wji∂E=ηδjOi
输出层各神经元的输出:
δj=∑k=1LδkjWkjf1′(Ij)\delta_{j}=\sum_{k=1}^{L}\delta_{kj}W_{kj}f^{'} _{1}(I_{j})δj=∑k=1LδkjWkjf1′(Ij)
4. 有关激励函数sigmoidsigmoidsigmoid的一些注意点:
BP算法常用sigmoidsigmoidsigmoid函数作为其激励函数,但要注意其输出取值范围,若逼近的函数输出取值范围为[0,1]时,f(x)f(x)f(x)应取:
f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}}f(x)=1+e−x1
但当其取值范围为[-1,1]时,f(x)f(x)f(x)应取:
f(x)=21+e−x−1f(x)=\frac{2}{1+e^{-x}}-1f(x)=1+e−x2−1
其余情况在此不再一一举例,除此之外,也可对拟合函数进行归一化处理后再操作。
5. BP学习算法的计算步骤:
(1)初始化:置所有权值为较小的随机数;
(2)提供训练集;
(3)计算实际输出:计算隐含层、输出层各神经元输出;
(4)计算目标值与实际输出的偏差E;
(5)计算ΔWkj\Delta W_{kj}ΔWkj;
(6)计算ΔWji\Delta W_{ji}ΔWji;
(7)返回“(2)”重复计算,直到误差满足要求为止。
5. BP学习算法的改进(增加动量项系数):
在没有附加动量的作用下,网络有可能会陷入较浅的局部极小值,而非求得全局极小值,利用附加动量的作用则有可能滑过这些极小值。
ΔWji(n)=−η∂E∂Wji+αΔWji(n−1)\Delta W_{ji}(n)=-\eta \frac{ \partial E}{ \partial W_{ji}}+ \alpha \Delta W_{ji}(n-1)ΔWji(n)=−η∂Wji∂E+αΔWji(n−1)
二、Matlab程序实现
1. BP学习算法原理实现程序
%%%%%%%%%%%%%%%%%%%%%运行环境:MATLAB R2020a%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%作者:小方%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clc;
clear;
%%%%%%%%%%%%%%%%%% BP网络第一阶段 学习期 %%%%%%%%%%%%%%%%%%%%%%
lr=0.005; %初始化
err=0.0001;
max_epoch=5000; %设置训练次数5000次
a=0.7; %a为动量项系数
Oi=0;Ok=0;
X=0:0.01:2*pi; %提供训练样本集
[n,datax]=size(X); %datax为所取sinx的采样点数
for i = 1:dataxD(i)=sin(X(i));
end
E=zeros(1,datax); %误差随迭代次数的变化
value=zeros(1,datax); %模型输出的结果
m=1;q=10;L=1; %bp网络结构参数初始化
wji=rand(q,m);
b1=rand(q,1); %隐含层神经元的阈值
wkj=rand(L,q);
b2=rand(m,1); %输入层神经元的阈值
wji0=zeros(size(wji));
wkj0=zeros(size(wkj));
for epoch = 1:max_epoch %循环次数Et=0;for i = 1:datax %从0到2*pi取值netj=wji*X(i)-b1;for j = 1:qOj(j,1)=2/(1+exp(-netj(j,1)))-1;endnetk=wkj*Oj-b2;Ok=2/(1+exp(-netk))-1;value(i)=Ok;e=value(i)-D(i); %误差%反馈,修改参数db2=-1*lr*e;dWkj=e*lr*Oj';db1=zeros(q,1);for j = 1:qdb1(j)=wkj(j)*(1/(1+exp(-Oj(j))))*(1-(1/(1+exp(-Oj(j)))))*(-1)*e*lr; enddwji=zeros(q,1);for j = 1:qdwji(j)=wkj(j)*(1/(1+exp(-netj(j))))*(1-(1/(1+exp(-netj(j)))))*X(i)*e*lr; endw=wji;wji=wji-dwji+a*(wji-wji0);wji0=w;b1=b1-db1;w=wkj;wkj=wkj-dWkj+a*(wkj-wkj0);wkj0=w;b2=b2-db2;Et=Et+abs(e);endE(epoch)=Et;if mod(epoch,100) == 0epochend
end
epoch
figure(1);
plot(E,'r');
title('总误差变化曲线');
axis([0,5000,0,400]);
figure(2);
plot(X,D,'r');
hold on;
plot(X,value,'k');
legend('红线为正确值','黑线表示训练后输出值');
title('sinx在[0,2*pi]训练集曲线');
%%%%%%%%%%%%%%%%%% BP网络第二阶段 工作期 %%%%%%%%%%%%%%%%%%%%%%
X1=pi:0.01:3*pi;
[n,datax1]=size(X1);
value1=zeros(1,datax1); %模型输出的结果
for i = 1:datax1 %从pi到3*pi取值netj=wji*X1(i)-b1;for j = 1:qOj(j,1)=2/(1+exp(-netj(j,1)))-1;endnetk=wkj*Oj-b2;Ok=2/(1+exp(-netk))-1;value1(i)=Ok;
end
figure(3);
plot(X1,sin(X1),'r');
hold on;
plot(X1,value1,'k');
legend('红线为正确值','黑线表示工作期的输出值');
title('sinx在[pi,3*pi]测试集预测曲线');
2. 使用库函数实现BP学习算法
%%%%%%%%%%%%%%%%%%%%%运行环境:MATLAB R2020a%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%作者:小方%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
clc;
p=0:0.001:2*pi; % 提供训练样本集
[n,datax]=size(p); % datax为所取sinx的采样点数
for i = 1:dataxd(i)=sin(p(i));
end
m=1;hide=10;L=1;
net = newff(p,d,hide,{'tansig','tansig','tansig'},'trainlm');
net.trainparam.epochs=5000; % 训练次数,这里设置为5000次
quanji = rands(hide,m); % 随机矩阵,生成-1~1之间随机数
faV = rands(hide,1);
net.IW{1,1}=quanji; % IW是输入层到隐藏层的权值矩阵
net.b{1}=faV ; % b{1} 表示隐含层的阀值矩阵
quankj = rands(L,hide); % 随机矩阵,生成-1~1之间随机数
net.LW{2,1}=quankj; % LW是隐藏层和输出层的权值矩阵
faW = rands(L,1);
net.b{2}=faW;
net.trainParam.goal=1e-7; % 训练目标最小误差,这里设置为1e-5
net.trainParam.lr=0.5; % 学习速率,这里设置为0.5
net.trainParam.mc=0.05; % 动量因子
net1 = train(net,p,d) ;
p1=pi:0.001:3*pi;
Y = sim(net1,p1)
plot(p,sin(p),'r.');
hold on;
plot(p1,Y,'k');
legend('红点为正确值','黑线表示工作期的输出值');
title('sinx在[pi,3*pi]测试集预测曲线');
三、结果显示
1、仿真结果(动量项系数a=0,迭代5000次):
2、仿真结果(动量项系数a=0.7,迭代5000次):
3、库函数仿真结果(迭代5000次):
对于该题,首先采用x=0:0.01:2πx=0:0.01:2πx=0:0.01:2π,以及y=sin(x)y=sin(x)y=sin(x)作为训练集,对bp神经网络进行训练,采用x1=π:0.01:3πx1=π:0.01:3πx1=π:0.01:3π,作为测试集,测试已训练好的bp神经网络。
通过结果可以看到,该bp神经网络能够实现对于sin(x)sin(x)sin(x)的函数逼近。同时,对比添加动量项系数的结果,可以看出,添加动量项系数后,bp神经网络的总误差能够更快的趋近于0。
但在不断调试的过程中也出现了几个问题,一是偶尔加了动量项系数的总误差趋于0的速度并没有未加动量项系数的总误差趋于0的速度快,除此之外,偶尔测试集预测的结果趋势对,但曲线较正确曲线偏差较大,分析原因,主要是因为初始参数设置为随机数导致了最终结果的不确定性。二是发现测试集预测的结果开始较为准确,但越往后越不准确,分析原因,应该是预测必须是根据前一段较长区间的值来预测后面较短区间的值,因此也就理解了出现该结果的原因。
同时,也测试了用库函数实现bp神经网络的方法,结果与之前类似,证明了结果的正确性。
用BP神经网络实现任意非线性函数逼近(以sinx为例)相关推荐
- 系统辨识实例(2)——利用BP神经网络进行基本非线性函数辨识
下面通过一个简单的实例介绍利用BP神经网络进行基本非线性函数辨识. 目录 一.实例介绍 二.程序设计 三.运行结果 一.实例介绍 利用BP神经网络对非线性函数--正弦函数进行辨识逼近. 二.程序设计 ...
- 前馈神经网络【BP神经网络】【newff函数】
神经网络模型 (1) 前馈神经网络 ( Feedforward Neural Networks ) 前馈网络也称前向网络.这种网络只在训练过程会有反馈信号,而在分类过程中数据只能向前传送,直到到达输出 ...
- 深度学习--TensorFlow(6)神经网络 -- 拟合线性函数非线性函数
目录 一.拟合线性函数 1.生成随机坐标 2.神经网络拟合 代码 二.拟合非线性函数 1.生成二次随机点 2.神经网络拟合 代码 一.拟合线性函数 学习率0.03,训练1000次: 学习率0.05,训 ...
- 利用matlab的newff构建BP神经网络来实现数据的逼近和拟合
假设P是原始数据向量: T是对应的目标向量: 现在需要通过神经网络来实现P->T的非线性映射. net = newff(minmax(P),[16,1],{'tansig','purelin'} ...
- 用jupyter book导入excel数据做最小二乘多项式及任意非线性函数拟合
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.从excel导入数据 二.多项式拟合 三.任意函数拟合 一.从excel导入数据 import matplotlib.p ...
- BP神经网络+遗传算法:求取非线性函数极值(一)
1.问题描述 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找其函数极值,这类问题可以通过利用BP神经网络的非线性拟合能力和遗传算法的非线性寻优能力来解决. 设非线性函数表达式如下: 其函数 ...
- BP神经网络原理及Matlab实现(Back Propagation Neural Networks,BPNN)
BP神经网络原理及matlab实现 一.简介 1.BP 神经网络的信息处理方式的特点 2.BP神经网络的主要功能 二.神经网络的训练 1.神经网络拓扑结构(隐含层)的确定 2.网络的初始连接权值 3. ...
- MATLAB中BP神经网络用于回归拟合算法实现(另附GRNN代码)
BP神经网络:是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络.神经网络是把生活中的常见情节推 ...
- matlab神经网络动量因子,bp神经网络的动量因子
基于自适应动量因子的 BP 神经网络优化方法研究 王锦[1]; 赵德群[1]; ... 1? n为训练次数,η为动量因子,一般取0.95左右 18 16 4.6 BP人工神经网络模型的改进 4. 引入 ...
最新文章
- SAP QM QP02 没有ECO试图直接修改检验计划主数据?
- QTextEdit查找某个字符串更换颜色样式
- C语言学习记录_2019.02.02
- 服务器优化:Tomcat、JVM性能调优笔记
- python 中的pickle库
- gitlab10.x迁移_1.x到2.x的迁移:可观察与可观察:RxJava FAQ
- Golang时间格式化
- 为什么QQ浏览器不是默认浏览器但是在打开网页的时候还是默认启动?
- 树莓派python安装xlwt_利用python包(xlrd和xlwt)处理excel
- 第一次自己成功写成的js程序
- cesium 模型绕点飞行一周
- 腾讯翻译君在线翻译怎么翻译整个文件_腾讯文档:在线多人协作文档工具
- python语言中整数1010的二进制、八进制_C语言中的二进制数、八进制数和十六进制数...
- android reboot重启分析
- 基于ssm与maven,使用easyui--tree生成类似部门管理树形结构图
- PIC16F887 单片机 灯光控制系统 PROTEUS 基于单片机的灯光控制系统
- Dubbo配置加载问题
- CloudBees程序员就如何开发可大规模扩展的HTTP服务器进行演讲
- 软件变异体测试(mutation test)
- 【调剂】华北电力大学(保定)2022年硕士研究生部分专业接收调剂公告