BP神经网络算法笔记

神经网络作为运用广泛的智能算法,被用于很多技术领域,虽然在Matlab等软件当中已经封装了相关的函数库,任何人都能够十分方便地使用编程软件构建神经网络。但是笔者认为如果不能详细了解神经网络的构建过程,那么对于神经网络的了解也将是雾里看花,使用也是十分僵化不能变通。因此,详细地自主架构神经网络是很有必要的。

目标:BP神经网络
作用:拟合数据,输入数据为0.32,0.87,0.89,0.33;目标输出为0.99,0.32,0.45,0.12。
参考:https://blog.csdn.net/zhaomengszu/article/details/77834845.

算法原理

神经网络算法是典型的学习型算法,其输出结果与执行次数有关,算法系统中存在负反馈调节,符合如下的系统流程:

BP神经网络主要由前向传播和后向传播两个算法组成,通过正向传播和反向传播之间的不断循环实现基于目标的学习。正向传播的作用是复现我们的推演假设,得到推演结果,反向传播算法的主要作用是依据上一次推演结果判断误差,并实现对于参数的调整,预备下一次运算。其中决定神经网络性能之一的便是反向传播的方式和方法,BP神经网络采用的是梯度下降法来确定性能。由于本文主要任务是将概念性的公式翻译成编程语言,因此算法的推导和变形不做过多赘述,仅列出已经经过简化之后的公式,相关推导请阅读参考博文。

算法步骤

构建神经网络为4输入4输出,目标隐含层的个数设计为3,层数为1,示意图如下:

具体算法步骤:
1)确定相关数值:设定每层传播之间的权值(图示的w1和w2,分别为43和34的数组),确定学习效率yeta=0.5,输入数据和参考目标;
2)构建前向传播算法,确定隐含层的数据,使用激活函数为Sigmod函数,具体公式为:

如法炮制,计算出实际输出层的值:

完成前向传播模块布置;
3)构建后向传播算法,更新w1和w2的值,具体公式如下:

由于参考文章中已有推导证明,可以自行阅读。
如法炮制再向前更新一步,计算出w1,但是结果略微有所区别,具体公式如下:

前向传播算法完成。
4)加上循环嵌套和相应的连接代码,完成算法,具体代码如下:

a=[0.32,0.87,0.89,0.33]                        #实际输入
target_c=[0.99,0.32,0.45,0.12]                 #目标输出w1=[[0.4,0.5,0.6],[0.4,0.5,0.6],[0.4,0.5,0.6],[0.4,0.5,0.6]]       #第一层传播权值
w2=[[0.3,0.4,0.5,0.6],[0.4,0.5,0.6,0.7],[0.5,0.6,0.7,0.8]]         #第二层传播权值Etc=[]                                        #隐含层数据
c=[]                                          #实际输出yeta=0.5
e=2.71828def forward():                                   #前项传播算法for i in range(3):x1=0for j in range(4):x1=x1+a[j]*w1[j][i]x1=1/(1+e**(-1*x1))Etc.append(x1)for i in range(4):x2=0for j in range(3):x2=x2+Etc[j]*w2[j][i]x2=1/(1+e**(-1*x2))c.append(x2)def behind():                                     #后向传播算法for i in range(3):for j in range(4):w2[i][j]=w2[i][j]+yeta*(target_c[j]-c[j])*c[j]*(1-c[j])*Etc[i]for i in range(4):for j in range(3):x4=0for k in range(4):x4=x4+(target_c[k]-c[k])*c[k]*(1-c[k])*w2[j][k]w1[i][j]=w1[i][j]+yeta*x4*Etc[j]*(1-Etc[j])*a[i]def clear():c.clear()Etc.clear()for i in range(100000):                          #学习过程forward()behind()clear()forward()
print(c)

上述代码思路与参考思路略有不同,做过一定的简化,但是并不影响运行,从最后所得出的数据便可以很直观地看出来。

代码测试

下面展示一下具体执行过程中的结果输出:

上图所示分别为学习过程执行了1次、10次、100次、1000次、10000次之后的结果,最终的结果和参考目标0.98,0.32,0.45,0.12的误差几乎没有,说明收敛完成,精度很高。
并给出相关的参数值:
w1=[1.388,1.458,1.528
3.086,3.105,3.125
3.147,3.165,3.184
1.419,1.488,1.558]
w2=[4.161,-1.448,-0.923,-2.721
4.283,-1.366,-0.836,-2.651
4.404,-1.284,-0.750,-2.580]

总结

本次代码个人认为比较成功地实现了BP神经网络的作用,最终也得到了比较精确的结果,通过数据我还发现:BP神经网络在处理尖峰的时候会出现数据消峰现象,即在学习次数有限时,位于尖峰处的数据响应永远是最慢的。观察上述数据我们发现在执行10000次学习之后,后三个数据的精度都已经达到了0.0001,而第一位数据与目标的差距数量级还在0.01。分析原因是BP神经网络的收敛函数速度较慢,对于偏差比较大的数据不能够较快地收敛到位,因此才会出现数据消峰的情况。测试过程中出现的第一个数据的问题符合BP神经网络的特征,因此认为测试代码的确符合BP神经网络的运算。
当然,笔者也感觉到此次代码存在不足,后面会继续修正。

BP神经网络学习与代码预演相关推荐

  1. 基于PCA主成分分析的BP神经网络回归预测MATLAB代码

    基于PCA主成分分析的BP神经网络回归预测MATLAB代码 代码注释清楚. 先对数据集进行主成分分析,自主根据贡献率选择主成分:同时计算KMO验证值:用PCA以后数据进行BP神经网络回归预测. 可以读 ...

  2. matlab 植物生长算法,基于模拟植物生长的BP神经网络学习算法研究

    第29卷第3期 2 8年6月 JOURNAL OF DALIAN UNIVERSITY VOL29 N住3 Jun. 2 8 基于模拟植物生长的BP神经网络学习算法研究李彤*,于江波,温钰 (大连大学 ...

  3. bp神经网络预测python代码_机器学习之多层神经网络(附Python代码和数据)

    1 引言 多层神经网络,Multiple-layers Perceptron (MLP),又被称为多层感知机,是机器学习中深度学习的典型算法.关于多层神经网络的算法原理,我们在Stata和R实现的文章 ...

  4. 搭建BP神经网络(完整代码快速上手)

    搭建BP神经网络 具体思想:随机权重-向前计算--------误差-------权重更新----再来一遍-------达到误差限-----停止 1.搭建步骤 步骤编号 具体内容 1 读取数据 2 设置 ...

  5. BP神经网络(python代码)

    神经网络是深度学习的基础.个人理解神经网络就是可以拟合任何一种广义线性模型的结构,本文主要记录python代码的学习笔记. BP神经网络原理(待补充,可以详见<数据挖掘概念与技术>P258 ...

  6. 基于遗传算法GA算法优化BP神经网络(Python代码实现)

    一. 概述 BP-GA算法的设计︰基于遗传算法的BP神经网络算法(以下简称BP-GA)就是在BP神经网络的学习过程中,将权重和阀值描述为染色体,并选取适宜的适应函数,然后进行GA迭代,直到某种意义上的 ...

  7. BP神经网络(原理及代码实现)

    前言   本文主要内容是BP神经网络的Python实现(借助tensorflow库)和C++实现(未借助相关库) Python实现BP神经网络 import os os.environ['TF_CPP ...

  8. bp神经网络应用实例_人工智能BP神经网络学习神器——AISPACE

    未经许可请勿转载 更多数据分析内容参看这里 今天我们来介绍一套小工具--AISPACE,它有助于你学习BP神经网络运作的过程及原理.AISPACE涉及的一系列工具用于学习和探索人工智能的概念,它们是在 ...

  9. MATLAB从入门到精通:搭建一个 简单的Bp神经网络(附代码)

    01 | 构建数据集 构造一个1行1000列的一维矩阵,这1000个数全部都在(0,1)这个区间内.规定当某一列的数字大于等于0.5时,输出为1,否则输出-1.构造数据集的代码如下. %% 构造数据集 ...

  10. 机器学习(一):BP神经网络(含代码及注释)

    目录 人工神经网络 神经网络分类 BP神经网络 代码实现 人工神经网络 人们利用数学模型来模仿生物神经元传递信息以及做出决策等等.       下图神经网络数学模型可以等效为输入矩阵X与系数矩阵W相乘 ...

最新文章

  1. 六个最佳的软件工程实践(基于构件的体系结构、可视化建模)
  2. 统一沟通-技巧-10-Lync-公网证书-Go Daddy
  3. 利用脑记录产生的合成语音
  4. python 创建空文件的方法
  5. pythonfor循环break_python 中 for 循环 if循环 break
  6. 最稳定的Nginx绿色环境,可无限自定义PHP和mysql版本、同时运行N个版本
  7. 图书管理员【2017年普及组第二题】
  8. 数据有序_详解数据库插入性能优化:合并+事务+有序数据进行INSERT操作
  9. 警惕!有“庄家”“大V”联合诱骗投资者,忽悠式荐股
  10. c语言知识点总结大全(史上最全)
  11. 第十五周助教心得体会
  12. Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies 问题解决
  13. Linux的安装与Linux下PHP开发环境的搭建(LAMP)
  14. 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】
  15. 在c语言中用switch编写月份,用switch语句从键盘输入一个月份,自动显示该月份的英文名称!C语言的...
  16. 守护线程------setDaemon(true)设置成守护线程
  17. ora-00604 ora-02429
  18. 老毛桃装机版制作启动U盘图文教程
  19. 【系统工具】Rundll32:Windows系统中的神奇工具,你知道吗?
  20. 怎么把idea中的项目上传到github上

热门文章

  1. IR2301高电压,高速功率MOSFET和IGBT驱动器介绍
  2. 阿尔泰USB5630数据采集卡
  3. 网易秋招编程题——优雅的点
  4. Power BI集成Power Apps,轻松实现用户在报告中任意输入信息
  5. filter函数 与filtfilt函数的效果区别
  6. OK6410之uboot移植
  7. Ps光速制作文字矢量图
  8. github代理地址
  9. 台式计算机cpu允许温度,台式机cpu温度多少正常 台式电脑工作时温度范围
  10. 安卓模拟器安装教程_雷电模拟器4.0去广告清爽版,详细安装教程,超简单!