为深入理解机器学习中BP神经网络算法,从网上找到的Java实现代码。

1、BP神经网络结构如下图所示,最左边的是输入层,最右边的是输出层,中间是多个隐含层,隐含层和输出层的每个神经节点,都是由上一层节点乘以其权重累加得到,标上“+1”的圆圈为截距项b(功能神经元结点的阈值),对输入层外每个节点:Y=w0*x0+w1*x1+…+wn*xn+b,神经网络相当于一个多层逻辑回归的结构。

算法计算过程:输入层开始,从左往右计算,逐层往前直到输出层产生结果。如果结果值和目标值有差距,再从右往左算,逐层向后计算每个节点的误差,并且调整每个节点的所有权重,反向到达输入层后,又重新向前计算,重复迭代以上步骤,直到所有权重参数收敛到一个合理值。由于计算机程序求解方程参数和数学求法不一样,一般是先随机选取参数,然后不断调整参数减少误差直到逼近正确值,所以大部分的机器学习都是在不断迭代训练,下面我们从程序上详细看看该过程实现就清楚了。

2、参考代码:

package sk.ml;import java.util.Random;
import java.util.Arrays;public class BpDeep {public double[][] layer;//神经网络各层节点public double[][] layerErr;//神经网络各节点误差public double[][][] layer_weight;//各层节点权重public double[][][] layer_weight_delta;//各层节点权重动量public double mobp;//动量系数public double rate;//学习系数public BpDeep(int[] layernum, double rate, double mobp){this.mobp = mobp;this.rate = rate;layer = new double[layernum.length][];layerErr = new double[layernum.length][];layer_weight = new double[layernum.length][][];layer_weight_delta = new double[layernum.length][][];Random random = new Random();for(int l=0;l<layernum.length;l++){layer[l]=new double[layernum[l]];layerErr[l]=new double[layernum[l]];if(l+1<layernum.length){layer_weight[l]=new double[layernum[l]+1][layernum[l+1]];layer_weight_delta[l]=new double[layernum[l]+1][layernum[l+1]];for(int j=0;j<layernum[l]+1;j++)for(int i=0;i<layernum[l+1];i++)layer_weight[l][j][i]=random.nextDouble();//随机初始化权重}   }}//逐层向前计算输出public double[] computeOut(double[] in){for(int l=1;l<layer.length;l++){for(int j=0;j<layer[l].length;j++){double z=layer_weight[l-1][layer[l-1].length][j];for(int i=0;i<layer[l-1].length;i++){layer[l-1][i]=l==1?in[i]:layer[l-1][i];z+=layer_weight[l-1][i][j]*layer[l-1][i];}layer[l][j]=1/(1+Math.exp(-z));//激活函数sigmoid}}return layer[layer.length-1];}//逐层反向计算误差并修改权重public void updateWeight(double[] tar){int l=layer.length-1;for(int j=0;j<layerErr[l].length;j++)layerErr[l][j]=layer[l][j]*(1-layer[l][j])*(tar[j]-layer[l][j]);while(l-->0){for(int j=0;j<layerErr[l].length;j++){double z = 0.0;for(int i=0;i<layerErr[l+1].length;i++){z=z+l>0?layerErr[l+1][i]*layer_weight[l][j][i]:0;layer_weight_delta[l][j][i]= mobp*layer_weight_delta[l][j][i]+rate*layerErr[l+1][i]*layer[l][j];//隐含层动量调整layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隐含层权重调整if(j==layerErr[l].length-1){layer_weight_delta[l][j+1][i]= mobp*layer_weight_delta[l][j+1][i]+rate*layerErr[l+1][i];//截距动量调整layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距权重调整}}layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//记录误差}}}public void train(double[] in, double[] tar){double[] out = computeOut(in);updateWeight(tar);}public static void main(String[] args){//初始化神经网络的基本配置//第一个参数是一个整型数组,表示神经网络的层数和每层节点数,比如{3,10,10,10,10,2}表示输入层是3个节点,输出层是2个节点,中间有4层隐含层,每层10个节点//第二个参数是学习步长,第三个参数是动量系数BpDeep bp = new BpDeep(new int[]{2,10,2}, 0.15, 0.8);//设置样本数据,对应4个二维坐标数据double[][] data = new double[][]{{1,2},{2,2},{1,1},{2,1}};//设置目标数据,对应4个坐标数据的分类double[][] target = new double[][]{{1,0},{0,1},{0,1},{1,0}};//迭代训练5000次for(int n=0;n<5000;n++)for(int i=0;i<data.length;i++)bp.train(data[i], target[i]);//根据训练结果来检验样本数据for(int j=0;j<data.length;j++){double[] result = bp.computeOut(data[j]);System.out.println(Arrays.toString(data[j])+":"+Arrays.toString(result));}//根据训练结果来预测一条新数据的分类double[] x = new double[]{3,1};double[] result = bp.computeOut(x);System.out.println(Arrays.toString(x)+":"+Arrays.toString(result));}
}

执行结果:

[1.0, 2.0]:[0.9778071886179536, 0.022187459499041468]
[2.0, 2.0]:[0.023368034603225344, 0.9769182145372335]
[1.0, 1.0]:[0.017374300590125305, 0.9821152168609936]
[2.0, 1.0]:[0.9784447508283497, 0.02175057450509929]
[3.0, 1.0]:[0.9853953389964808, 0.01690955109770975]

参考网址:http://www.tuicool.com/articles/MfYjQfV

机器学习知识点(九)BP神经网络Java实现相关推荐

  1. 机器学习 | MATLAB实现BP神经网络newff参数设定(下)

    机器学习 | MATLAB实现BP神经网络newff参数设定(下) 目录 机器学习 | MATLAB实现BP神经网络newff参数设定(下) 基本介绍 程序设计 参考资料 致谢 基本介绍 newff搭 ...

  2. 机器学习 | MATLAB实现BP神经网络newff参数设定(上)

    机器学习 | MATLAB实现BP神经网络newff参数设定(上) 目录 机器学习 | MATLAB实现BP神经网络newff参数设定(上) 基本介绍 程序设计 参考资料 致谢 基本介绍 newff搭 ...

  3. 机器学习 | MATLAB实现BP神经网络newff参数设定(中)

    机器学习 | MATLAB实现BP神经网络newff参数设定(中) 目录 机器学习 | MATLAB实现BP神经网络newff参数设定(中) 基本介绍 程序设计 参考资料 致谢 基本介绍 newff搭 ...

  4. 机器学习系列2 BP神经网络+代码实现

    神经网络简单的说,就是用一种层次化的方式将一堆简单的函数在顶层堆叠在一起,形成一个复杂的非线性函数,以此表达输入与输出之间的关系. 本文结构: 1.介绍构成神经网络的基本单元:神经元 2.介绍三层神经 ...

  5. 机器学习之基于BP神经网络的预测

    BP神经网络具有以下优点: 1) 非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数.这使得其特别适合于求解内部机制复 ...

  6. 吴恩达机器学习(九)—— 神经网络:Learning

    吴恩达机器学习系列内容的学习目录→\rightarrow→吴恩达机器学习系列内容汇总. 1. 代价函数 2. 反向传播算法 3. 反向传播算法的直观理解 4. 实现注意:展开参数 5. 梯度下降 6. ...

  7. 机器学习知识点(二十五)Java实现隐马尔科夫模型HMM之jahmm库

    1.隐马尔可夫模型HMM的应用场景,关乎于序列和状态变化的都可以.    发现java有可库,专为开发HMM,可惜只能在CSDN上有得下载.     2.jahmm是java开发隐马尔科夫模型的一个j ...

  8. 机器学习知识点(八)感知机模型Java实现

    感知机模型 假设输入数据集为表示是n个训练数据样本.输出y只有两个值(-1,+1)两个分类.那么感知机模型可以表示为以下函数: 其中sign是符号函数,意义如下.w表示权值,b表示偏置.我们就是需要通 ...

  9. 机器学习知识点(五)梯度下降法Java实现

    梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代(步长)能使待优化的目标函数逐步减小.梯度下降法是2范数下的最速下降法,用来求解函数的最小值,无约束优化. 看数学定义都晦涩,网 ...

最新文章

  1. Java 如何设计 API 接口,实现统一格式返回?
  2. DL之LeNet-5:LeNet-5算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. 网络存储空间_【百一案评】信息存储空间侵害作品信息网络传播权的认定——北京焦点公司诉北京百度公司侵害信息网络传播权纠纷案...
  4. 极狐(GitLab)宣布获数亿元A轮融资,将加速推动中国开源DevOps生态
  5. python调用node_在node中执行python脚本
  6. server 2008中新建AD域控制器
  7. 如何运用Python建立你的第一个Slack聊天机器人?
  8. 驱动开发专家解读《寒江独钓——Windows内核安全编程》
  9. 网络核心之数据交换-电路交换
  10. 山石防火墙增加端口映射
  11. 《梦断代码》阅读笔记03
  12. pytorch求解高维空间PDE
  13. 一步解压缩目录下所有的压缩文件
  14. ios 按钮图片拉伸_iOS中实现图片自适应拉伸效果的方法
  15. mysql嵌套查询;去重,分页综合查询
  16. 缺失数据的Bootstrap与Jackknife方法:《Statistical Analysis with Missing Data》习题5.1 5.2
  17. echarts3.7.1 用例体验地图
  18. android刷广告,android – 广告不可见.没有刷新广告.屏幕关闭后
  19. java版本实现推箱子小游戏
  20. oracle建表空间

热门文章

  1. 20190703 关于如何驱动
  2. Windows 环境下载安装Docker
  3. CentOS-文件操作
  4. Flask的Context(上下文)
  5. android学习笔记34——ClipDrawable资源
  6. 内置对象—request
  7. Sql Server截断日志(转)
  8. Symbian c++ MCameraObserver类的方法解释
  9. Android的开机流程及对应源码位置分析
  10. Android线性布局(Linear Layout)