一、BP神经网络的概念

    BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:
(三层BP神经网络模型)
BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

二、BP神经网络的流程

    在知道了BP神经网络的特点后,我们需要依据信号的前向传播和误差的反向传播来构建整个网络。

1、网络的初始化

    假设输入层的节点个数为,隐含层的节点个数为,输出层的节点个数为。输入层到隐含层的权重,隐含层到输出层的权重为,输入层到隐含层的偏置为,隐含层到输出层的偏置为。学习速率为,激励函数为。其中激励函数为取Sigmoid函数。形式为:

2、隐含层的输出

    如上面的三层BP网络所示,隐含层的输出

3、输出层的输出

4、误差的计算

    我们取误差公式为:
其中为期望输出。我们记,则可以表示为
以上公式中,

5、权值的更新

    权值的更新公式为:
这里需要解释一下公式的由来:
这是误差反向传播的过程,我们的目标是使得误差函数达到最小值,即,我们使用梯度下降法:
  • 隐含层到输出层的权重更新
则权重的更新公式为:
  • 输入层到隐含层的权重更新
其中
 
则权重的更新公式为:

6、偏置的更新

    偏置的更新公式为:
  • 隐含层到输出层的偏置更新
则偏置的更新公式为:
  • 输入层到隐含层的偏置更新
其中
 
则偏置的更新公式为:

7、判断算法迭代是否结束

    有很多的方法可以判断算法是否已经收敛,常见的有指定迭代的代数,判断相邻的两次误差之间的差别是否小于指定的值等等。

三、实验的仿真

    在本试验中,我们利用BP神经网络处理一个四分类问题,最终的分类结果为:

MATLAB代码

主程序
  1. %% BP的主函数
  2. % 清空
  3. clear all;
  4. clc;
  5. % 导入数据
  6. load data;
  7. %从1到2000间随机排序
  8. k=rand(1,2000);
  9. [m,n]=sort(k);
  10. %输入输出数据
  11. input=data(:,2:25);
  12. output1 =data(:,1);
  13. %把输出从1维变成4维
  14. for i=1:2000
  15. switch output1(i)
  16. case 1
  17. output(i,:)=[1 0 0 0];
  18. case 2
  19. output(i,:)=[0 1 0 0];
  20. case 3
  21. output(i,:)=[0 0 1 0];
  22. case 4
  23. output(i,:)=[0 0 0 1];
  24. end
  25. end
  26. %随机提取1500个样本为训练样本,500个样本为预测样本
  27. trainCharacter=input(n(1:1600),:);
  28. trainOutput=output(n(1:1600),:);
  29. testCharacter=input(n(1601:2000),:);
  30. testOutput=output(n(1601:2000),:);
  31. % 对训练的特征进行归一化
  32. [trainInput,inputps]=mapminmax(trainCharacter');
  33. %% 参数的初始化
  34. % 参数的初始化
  35. inputNum = 24;%输入层的节点数
  36. hiddenNum = 50;%隐含层的节点数
  37. outputNum = 4;%输出层的节点数
  38. % 权重和偏置的初始化
  39. w1 = rands(inputNum,hiddenNum);
  40. b1 = rands(hiddenNum,1);
  41. w2 = rands(hiddenNum,outputNum);
  42. b2 = rands(outputNum,1);
  43. % 学习率
  44. yita = 0.1;
  45. %% 网络的训练
  46. for r = 1:30
  47. E(r) = 0;% 统计误差
  48. for m = 1:1600
  49. % 信息的正向流动
  50. x = trainInput(:,m);
  51. % 隐含层的输出
  52. for j = 1:hiddenNum
  53. hidden(j,:) = w1(:,j)'*x+b1(j,:);
  54. hiddenOutput(j,:) = g(hidden(j,:));
  55. end
  56. % 输出层的输出
  57. outputOutput = w2'*hiddenOutput+b2;
  58. % 计算误差
  59. e = trainOutput(m,:)'-outputOutput;
  60. E(r) = E(r) + sum(abs(e));
  61. % 修改权重和偏置
  62. % 隐含层到输出层的权重和偏置调整
  63. dw2 = hiddenOutput*e';
  64. db2 = e;
  65. % 输入层到隐含层的权重和偏置调整
  66. for j = 1:hiddenNum
  67. partOne(j) = hiddenOutput(j)*(1-hiddenOutput(j));
  68. partTwo(j) = w2(j,:)*e;
  69. end
  70. for i = 1:inputNum
  71. for j = 1:hiddenNum
  72. dw1(i,j) = partOne(j)*x(i,:)*partTwo(j);
  73. db1(j,:) = partOne(j)*partTwo(j);
  74. end
  75. end
  76. w1 = w1 + yita*dw1;
  77. w2 = w2 + yita*dw2;
  78. b1 = b1 + yita*db1;
  79. b2 = b2 + yita*db2;
  80. end
  81. end
  82. %% 语音特征信号分类
  83. testInput=mapminmax('apply',testCharacter',inputps);
  84. for m = 1:400
  85. for j = 1:hiddenNum
  86. hiddenTest(j,:) = w1(:,j)'*testInput(:,m)+b1(j,:);
  87. hiddenTestOutput(j,:) = g(hiddenTest(j,:));
  88. end
  89. outputOfTest(:,m) = w2'*hiddenTestOutput+b2;
  90. end
  91. %% 结果分析
  92. %根据网络输出找出数据属于哪类
  93. for m=1:400
  94. output_fore(m)=find(outputOfTest(:,m)==max(outputOfTest(:,m)));
  95. end
  96. %BP网络预测误差
  97. error=output_fore-output1(n(1601:2000))';
  98. k=zeros(1,4);
  99. %找出判断错误的分类属于哪一类
  100. for i=1:400
  101. if error(i)~=0
  102. [b,c]=max(testOutput(i,:));
  103. switch c
  104. case 1
  105. k(1)=k(1)+1;
  106. case 2
  107. k(2)=k(2)+1;
  108. case 3
  109. k(3)=k(3)+1;
  110. case 4
  111. k(4)=k(4)+1;
  112. end
  113. end
  114. end
  115. %找出每类的个体和
  116. kk=zeros(1,4);
  117. for i=1:400
  118. [b,c]=max(testOutput(i,:));
  119. switch c
  120. case 1
  121. kk(1)=kk(1)+1;
  122. case 2
  123. kk(2)=kk(2)+1;
  124. case 3
  125. kk(3)=kk(3)+1;
  126. case 4
  127. kk(4)=kk(4)+1;
  128. end
  129. end
  130. %正确率
  131. rightridio=(kk-k)./kk

激活函数

  1. %% 激活函数
  2. function [ y ] = g( x )
  3. y = 1./(1+exp(-x));
  4. end

转载——关于bp神经网络的更多相关文章

  1. 【转载】BP神经网络

    原文地址:http://blog.csdn.net/acdreamers/article/details/44657439 今天来讲BP神经网络,神经网络在机器学习中应用比较广泛,比如函数逼近,模式识 ...

  2. BP神经网络—java实现(转载)

    神经网络的结构 神经网络的网络结构由输入层,隐含层,输出层组成.隐含层的个数+输出层的个数=神经网络的层数,也就是说神经网络的层数不包括输入层.下面是一个三层的神经网络,包含了两层隐含层,一个输出层. ...

  3. 数据挖掘系列(9)——BP神经网络算法与实践

    神经网络曾经很火,有过一段低迷期,现在因为深度学习的原因继续火起来了.神经网络有很多种:前向传输网络.反向传输网络.递归神经网络.卷积神经网络等.本文介绍基本的反向传输神经网络(Backpropaga ...

  4. bp神经网络及matlab实现

    本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集 ...

  5. RBF神经网络和BP神经网络的关系

    作者:李瞬生链接:https://www.zhihu.com/question/44328472/answer/128973724来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. BP神经网络的公式推导

    如果感觉自己看不懂,那就看看我博客的梯度下降法,博文最后的感知机也算最简单的BP神经网络吧,用的也是反馈(w,b):典型梯度下降法 BP网络的结构 BP网络的结构如下图所示,分为输入层(Input), ...

  7. BP神经网络的数学原理及其算法实现

    什么是BP网络 BP网络的数学原理 BP网络算法实现 转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/44514073  上一篇 ...

  8. BP神经网络-- 基本模型

    转载:http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html BP 神经网络中的 BP 为 Back  Propagation 的简写,最早它 ...

  9. 模式识别之ocr项目---(模板匹配&BP神经网络训练)

    摘 要 在MATLAB环境下利用USB摄像头采集字符图像,读取一帧保存为图像,然后对读取保存的字符图像,灰度化,二值化,在此基础上做倾斜矫正,对矫正的图像进行滤波平滑处理,然后对字符区域进行提取分割出 ...

随机推荐

  1. [Vue]实例化Vue时的两种挂载方式el与$mount

    Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作.判断等),之后要手动挂载上.new Vue时,el和$mount并没有本质上的不同. 1.el Vue实 ...

  2. Kafka分布式:ZooKeeper扩展

    [ZooKeeper] 服务注册.服务发现.客户端负载均衡.Offset偏移量分布式存储. kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer) ...

  3. 配置Eclipse可以查看JDK类库源码

    一.配置方法 配置Eclipse可以查看JDK类库源码 Window->Preferences->Java->Installed JREs 若没有JRE,需要自己添加进来,有的话,点 ...

  4. 第十天 1-9 rhel7-文件的归档和压缩

    大纲:文件的归档和压缩1.tar命令的使用及参数解析tar.gz.bz/bz2文件的创建.查看及解压zip/unzip命令的使用 一.文件的归档和压缩 在我们的计算机中,经常会遇到有好多文件名相似或作 ...

  5. MongoDB 3.4 分片集群副本集 认证

    连接到router所在的MongoDB Shell  我本机端口设置在50000上 mongo --port 接下来的流程和普通数据库添加用户权限一样 db.createUser({user:&quo ...

  6. IOS-启动图和开屏广告图,类似网易

    作者:若锦 原文链接:http://www.jianshu.com/p/e52806516139 启动图是在iOS开发过程中必不可少的一个部分,很多app在启动图之后会有一张自定义的开屏广告图,点击该 ...

  7. 华为EPON OLT开局配置

      配置思路: 1. 登录olt(console进去之后配地址) 2.配置上联口(配vlan和起三层地址互联路由的lan口) 3.epon接分光器,分光器下接光猫 4.自动发现光猫.配置DBA数据和线 ...

  8. hdu4309

    题解: 暴力枚举 然后网络流 代码: #include<iostream> #include<cstdio> #include<cstring> using nam ...

  9. VS2005 使用体验

    鄙人记性真心不好,看了就忘.此文记录下日常小工具的tips. 1)VS的小番茄: 破解版 Visual.Assist.X.V10.6.1833支持VS2010 VS2008 VS2005 VC6 破解 ...

  10. Linux系统在启动过程中grub引导文件丢失的解决方法

    在/boot/grub2目录下有一个grub.cfg文件:该文件主要是用来自动地引导系统启动内核程序和系统的初始化程序. 问题一:当系统在启动的情况下,我们不小心删除/boot/grub2/grub. ...