一、人工神经网络

关于对神经网络的介绍和应用,请看如下文章

神经网络潜讲

如何简单形象又有趣地讲解神经网络是什么

二、人工神经网络分类

  • 按照连接方式——前向神经网络、反馈(递归)神经网络

  • 按照学习方式——有导师学习神经网络、无导师学习神经网络
  • 按照实现功能——拟合(回归)神经网络、分类神经网络

三、BP神经网络概述

1. 特点

  • BP神经网络中 BP 是指 BackPropagation (反向传播) ,指的是误差的反向传播 ,其信号是向前传播的 , 从结构上分类 ,它是前向有导师学习神经网络 ,BP神经网络要求激活函数必须是可微分的函数。

2. 学习算法

(1) 传播阶段

​ 首先是信号传播

​ 其次是误差的反向传播

​ 将误差按照信号的反方向传播,结果的误差由权值设置不合理造成,这个步骤用来保证输出结果的正确性。

(2) 权值更新阶段
  • 梯度下降法——利用梯度下降最快的方向进行权值修正

3. 举例

​ 图中是一个简单的神经网络,可以计算出 \[ y_{1} = f_{1}(w_1x_1+w_3x_2) \], $ y_2 = f_2(w_2x_1+w_4x_2+w_5x_3) $, $ y_3 = f_3(w_6x_3) $, \(y_4 = f_4(w_{11}y_1+w_{21}y_2+w_{31}y_3)\), \(y_5 = f_5(w_{32}y3)\)。

​ 最终输出为 \(y = f(w_{41}y4 + w_{51}y5)\) 。假设预期结果为 \(z\) 。

​ 可以将最终结果与预期结果 \(z\) 作对比,得到误差值 \(δ\) , 从而得到 \(δ_4 = w_{41}δ\) , \(δ_5 = w_{51}δ\) ,\(δ_1 = w_{11}δ_4\) ,\(δ_2 = w_{21}δ_4\) ,\(δ_3 = w_{31}δ_4+w_{32}δ_5\) 。

​ 因此可以得到 \(w_1\prime = w_1 + \eta\delta_1\cfrac{\mathrm{d}f_1(e) }{\mathrm{d}e}x_1\) , \(e\) 为 输入参数,其他权值修改同理。

四、数据归一化

  1. 什么是数据归一化

    • 将数据映射到 [0,-1] 或 [-1,1] 区间或其他区间
  2. 为什么要数据归一化
    • 输入数据的单位不一样,有些数据的范围很大,导致的结果是神经网络收敛慢、训练时间长。
    • 数据范围大的输入在模式分类中的作用可能会偏大,数据范围小的输入在模式分类中的作用可能会偏小
    • 由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。
    • 某些激活函数在 (0,1) 外很平缓,区分度很小。
  3. 归一化算法
    • \(y = (x-min)/(max - min)​\)
    • \(y = 2*(x-min)/(max - min)-1\)

五、函数介绍

  • 归一化函数——mapminmax()

    • [Y,PS] = mapminmax(X,YMIN,YMAX),X是预处理的数据,Ymin和Ymax是期望的每一行的最小值与最大值,Y是规范化得到的数据,这种规范化的映射记录在 PS 中。
    • Y = mapminmax('apply',X,PS),这种方法一般是用在上一条语句之后,用上一条语句得到的 PS ,可以使得这里要处理的数据的规范化规则和上一条是一样的。
    • X = mapminmax('reverse',Y,PS) ,预处理之后的数据进行反转得到原始数据 。
  • 创建前向神经网络——newff()
    • net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
    • P :输入参数矩阵。
    • T :目标参数矩阵。
    • S :N-1个隐含层的数目(S(i)到S(N-1)),默认为空矩阵[] 。
    • TF:相关层的传递函数,默认隐含层为tansig函数,输出层为purelin函数。此外还有 purelin: 线性传递函数。  tansig :正切S型传递函数。logsig :对数S型传递函数。
    • BTF:BP神经网络学习训练函数,默认值为trainlm函数 。此外还有 traingd:最速下降BP算法。traingdm:动量BP算法。trainda:学习率可变的最速下降BP算法。traindx:学习率可变的动量BP算法。trainrp:弹性算法。变梯度算法:traincgf(Fletcher-Reeves修正算法)traincgp(Polak_Ribiere修正算法)traincgb(Powell-Beale复位算法)trainbfg(BFGS 拟牛顿算法)trainoss(OSS算法)。
    • BLF:权重学习函数,默认值为learngdm。PF:性能函数,默认值为mse,可选择的还有sse,sae,mae,crossentropy。
    • IPF,OPF,DDF均为默认值即可。
  • 训练函数——train()
    • [net,tr,Y,E,Pf,Af] = train(net,P,T,Pi,Ai)
    • net:神经网络
    • P : 神经网络输入
    • T:神经网络目标(可选,有或无)
    • Pi:初始输入延迟条件(默认为0)
    • Ai:初始层延迟条件(默认为0)
    • 返回值 net :新的训练过的网络
    • 返回值 tr :训练记录
  • 仿真,模拟,预测——sim()
    • [Y,Pf,Af,E,perf] = sim(net,P,Pi,Ai,T)
    • Y:输出
    • Pf:最终输出延迟
    • Af:最终层延迟
    • E:误差向量
    • perf:平均绝对误差(网络性能)
    • P:输入
    • Pi:初始输入延迟,默认为0
    • Ai:初始层延迟,默认为0
    • T:神经网络目标

六、具体实例

  • 问题描述

  • 解题思路

  • 代码

%% I. 清空环境变量
clear all
clc

%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat

%%
% 2. 随机产生训练集和测试集,因为是随机产生,所以每次执行的结果会不同
temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 测试集——10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);

%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);

[t_train, ps_output] = mapminmax(T_train,0,1);

%% IV. BP神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newff(p_train,t_train,9);

%%
% 2. 设置训练参数
net.trainParam.epochs = 1000; %迭代次数
net.trainParam.goal = 1e-3; %训练目标,误差范围
net.trainParam.lr = 0.01; %学习率

%%
% 3. 训练网络
net = train(net,p_train,t_train);

%%
% 4. 仿真测试
t_sim = sim(net,p_test);

%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);

%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;

%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));

%%
% 3. 结果对比
result = [T_test' T_sim' error']

%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]}; %越接近1,效果越好
title(string)

  • 执行结果

  • 参数对BP神经网络影响

    • 隐含层神经元节点个数
    • 激活函数类型的选择
    • 学习率
    • 初始权值与阈值
    • 交叉验证
    • 留一法

七、源码及数据下载

链接:https://pan.baidu.com/s/1PFhsEF-nBf1h2Ch3XYh4IA 密码:ebih

BP神经网络原理及在Matlab中的应用的更多相关文章

  1. 机器学习(4):BP神经网络原理及其python实现

    BP神经网络是深度学习的重要基础,它是深度学习的重要前行算法之一,因此理解BP神经网络原理以及实现技巧非常有必要.接下来,我们对原理和实现展开讨论. 1.原理  有空再慢慢补上,请先参考老外一篇不错的 ...

  2. BP神经网络原理及python实现

    [废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...

  3. deep learning(1)BP神经网络原理与练习

    具体原理参考如下讲义: 1.神经网络 2.反向传导 3.梯度检验与高级优化 看完材料1和2就可以梳理清楚bp神经网络的基本工作原理,下面通过一个C语言实现的程序来练习这个算法 //Backpropag ...

  4. BP神经网络原理详解

    转自博客园@编程De: http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html  http://blog.sina.com.cn/s/blog ...

  5. 机器学习入门学习笔记:(一)BP神经网络原理推导及程序实现

    机器学习中,神经网络算法可以说是当下使用的最广泛的算法.神经网络的结构模仿自生物神经网络,生物神经网络中的每个神经元与其他神经元相连,当它“兴奋”时,想下一级相连的神经元发送化学物质,改变这些神经元的 ...

  6. bp神经网络原理

    bp(back propagation)修改每层神经网络向下一层传播的权值,来减少输出层的实际值和理论值的误差 其实就是训练权值嘛 训练方法为梯度下降法 其实就是高等数学中的梯度,将所有的权值看成自变 ...

  7. Matlab的BP神经网络工具箱及其在函数逼近中的应用

    1.神经网络工具箱概述 Matlab神经网络工具箱几乎包含了现有神经网络的最新成果,神经网络工具箱模型包括感知器.线性网络.BP网络.径向基函数网络.竞争型神经网络.自组织网络和学习向量量化网络.反馈 ...

  8. BP神经网络与Python实现

    人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善. 联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测, 网 ...

  9. Python语言编写BP神经网络

    Python语言编写BP神经网络 2016年10月31日 16:42:44 ldy944758217 阅读数 3135   人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善 ...

随机推荐

  1. Luogu5401 CTS2019珍珠(生成函数+容斥原理+NTT)

    显然相当于求有不超过n-2m种颜色出现奇数次的方案数.由于相当于是对各种颜色选定出现次数后有序排列,可以考虑EGF. 容易构造出EGF(ex-e-x)/2=Σx2k+1/(2k+1)!,即表示该颜色只 ...

  2. vijo 1456最小总代价

    题意:中文题... 题解:状态比较多,可以说是状压的基础题吧,我们定义dp[i][j],j为一个二进制数,每位0表示接触过该物品,1表示没有接触过;j表示当前物品在谁手上.递推的顺序注意一下就好 ac ...

  3. JavaScript常用节点类型

    一.常用节点类型: nodeType:节点类型 nodeName:节点名称 nodeValue:节点值 1.查看节点类型(控制台操作): 获取元素:var p = document.getElemen ...

  4. 使用angularJS设置复选框的回显状态

    思路分析: 在angularJS中,我们可以使用ng-checked="expression()"来设置复选框的状态:当expression()返回true时,该复选框为选择中状态 ...

  5. 使用node建立本地服务器访问静态文件

    最终目录结构 demo │ node_modules └───public │ │ index.html │ │ index.css │ └───index.js └───server.js 一.使用 ...

  6. php权限管理

    首先权限管理肯定是需要登陆的,这里就简单的写一个登陆页面. 简单的登陆页面login.php <h1>登录页面</h1> <form action="login ...

  7. asp.net 页面按回车就会触发button按钮事件

    转载于 https://www.cnblogs.com/anz130/articles/2445830.html 转自:http://space.itpub.net/12639172/viewspac ...

  8. springboot整合freemarker模板引擎后在页面获取basePath绝对路径

    在项目中引用静态资源文件或者进行ajax请求时我们有时候会使用 ${basePath} ,其实这就是一种获取绝对路径的方式: 那么在springboot项目中要怎么配置才能使用 basePaht呢? ...

  9. React组件的定义、渲染和传值总结

    一.组件的定义 1.使用JavaScript函数定义 Welcome.js import React from 'react'; function Welcome() { return ( <d ...

  10. 小知识——c++关于指针的理解

    参考文章: 简介: 指针可以简化c++编程,在一些任务中没有指针是无法完成的(动态内存分配) 使用 & 可以获得变量在内存中的地址: eg: #include <iostream> ...