一、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. HTML5如何做横屏适配

    在移动端中我们经常碰到横屏竖屏的问题,那么我们应该如何去判断或者针对横屏.竖屏来写不同的代码呢. 首先在head中加入如下代码: 1 <meta name="viewport" ...

  2. js的一些编码问题

    1 eval()的使用; 未声明变量的使用: 遗漏的分号; 不恰当的换行; 错误的逗号使用; 语句周围遗漏的括号; switch分支语名中遗漏的break; 重复声明的变量; with的使用; 错误使 ...

  3. 实例化后的map的默认值

    public class map默认值 { public static void main(String[] args) { Map<String, String> resultMap = ...

  4. FluentData,一个轻量级开源的.NET ORM数据持久化框架

    FluentData:一种使用Fluent API的新型轻量级ORM模型  FluentData 是微型 ORM(micro-ORM)家族的一名新成员,旨在比大型 ORM(full ORM)更加易用. ...

  5. ubuntu 16.04 配置远程连接

    1.XDMCP远程连接 vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 添加 greeter-show-manual-login=true [X ...

  6. Java集合详解3:Iterator,fail-fast机制与比较器

    Java集合详解3:Iterator,fail-fast机制与比较器 今天我们来探索一下LIterator,fail-fast机制与比较器的源码. 具体代码在我的GitHub中可以找到 https:/ ...

  7. 实现Callable接口创建线程

    创建执行线程有四种方式: 实现implements接口创建线程 继承Thread类创建线程 实现Callable接口,通过FutureTask包装器来创建线程 使用线程池创建线程 下面介绍通过实现Ca ...

  8. Java复习5.面向对象

    Java 复习5面向对象知识 20131004 前言: 前几天整理了C++中的面向对象的知识,学习Java语言,当然最重要的就是面向对象的知识,因为可以说Java是最正宗的面向对象语言,相比C++,更 ...

  9. vue单独给页面设置body属性

    因项目需求:用户个人详细信息页面设置背景色,之前在这个页面设置最外层div发现不行.因为app.vue影响了它.后来直接在页面上用body设置样式,发现影响了其他页面. 后来想了通过vue的生命周期来 ...

  10. Yii2学习笔记:汉化yii,设置表单的描述(属性标签attributeLabels)

    一:汉化框架 框架汉化在这里设置,如果不生效,前台后台的配置文件都设置下应该就可以了 二:汉化表单 汉化表单,直接在模型层设置,例如: 原来的联系我们表单 汉化后: ] 这种汉化在哪里修改呢?其实是设 ...