标准BP神经网络以及MATLAB实现

2023-10-27

BP神经网络的结构可分成三部分:

  • 输入层,输入数据;
  • 隐藏层,处理数据;
  • 输出层,输出结果。

        其过程可以分为正向传播过程和反向传播过程,在正向传播过程中,BP神经网络通过隐层神经元对数据进行处理,从而输出相应结果,在反向传播过程中BP神经网络通过对比真实结果与预测结果之间的误差E来不断调整各层神经元的参数值,从而减小误差,达到理想的效果。调整的原则是是误差不断减小,因此应使权值调整量与误差梯度下降成正比。

单隐藏层神经网络:

计算方法:

 z={sgn(a1w1+a2w2+a3w3)}

       其中f被称为激活函数,在单隐藏层神经网络中常用符号函数sgn()

        在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。

  偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。如下图。

 考虑了偏置以后的神经网络的矩阵运算如下:


g(W(1)*a(1)+b(1))=a(2)

g(W(2)*a(2)+b(2))=z

两层神经网络中,我们不再使用sgn函数作为激活函数,而是使用平滑函数sigmoid作为激活函数

         函数表达式:

S = 1/1+e^(-x)

多层神经网络:

 增加更多层次的好处:

  • 更深入的表示特征:网络层数增加,每一层对于前一层次的抽象表示更深入
  • 更强的函数模拟能力:网络参数越多,意味着其模拟的函数可以更加复杂,可以有更多的容量拟合真正的关系

在多层神经网络中,我们通常使用ReLU函数  f(x) = max(0,x)作为激活函数

总结:

以下是使用matlab的神经网络工具箱进行的BP神经网络实现:

%% 此程序为matlab编程实现的BP神经网络
% 清空环境变量
clear
close all
clc

%%第一步 读取数据
input=randi([1 50],200,2);  %载入输入数据
output=input(:,1)+input(:,2);  %载入输出数据

%% 第二步 设置训练数据和预测数据
input_train = input(1:190,:)';
output_train =output(1:190,:)';
input_test = input(191:200,:)';
output_test =output(191:200,:)';
%节点个数
inputnum=2; % 输入层节点数量
hiddennum=5;% 隐含层节点数量
outputnum=1; % 输出层节点数量
%% 第三本 训练样本数据归一化
[inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
[outputn,outputps]=mapminmax(output_train);
%% 第四步 构建BP神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练

W1= net. iw{1, 1};%输入层到中间层的权值
B1 = net.b{1};%中间各层神经元阈值

W2 = net.lw{2,1};%中间层到输出层的权值
B2 = net. b{2};%输出层各神经元阈值

%% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.00001

%% 第六步 BP神经网络训练
net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本

%% 第七步 测试样本归一化
inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化

%% 第八步 BP神经网络预测
an=sim(net,inputn_test); %用训练好的模型进行仿真

%% 第九步 预测结果反归一化与误差计算     
test_simu=mapminmax('reverse',an,outputps); %把仿真得到的数据还原为原始的数量级
error=test_simu-output_test;      %预测值和真实值的误差

%%第十步 真实值与预测值误差比较
figure('units','normalized','position',[0.119 0.2 0.38 0.5])
plot(output_test,'bo-')
hold on
plot(test_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('样本值')
title('BP神经网络测试集的预测值与实际值对比图')

[c,l]=size(output_test);
MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])


 预测结果:

 -----------------------误差计算--------------------------
隐含层节点数为5时的误差结果如下:
平均绝对误差MAE为:0.12181
均方误差MSE为:       0.02936
均方根误差RMSE为:  0.17135

文章参考:

BP神经网络预测matlab代码讲解与实现步骤_CJ-leaf的博客-CSDN博客_bp神经网络matlab代码

神经网络——最易懂最清晰的一篇文章_illikang的博客-CSDN博客_神经网络

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准BP神经网络以及MATLAB实现 的相关文章

  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • 在matlab中绘制给定区域内(两个圆之间)的向量场

    我想在 Matlab 中绘制下面的向量场 u cos x x 0 y y 0 v sin x x 0 y y 0 我可以在网格中轻松完成 例如 x 和 y 方向从 2 到 2 x 0 2 y 0 1 x y meshgrid 2 0 2 2
  • Matlab 的 imresize 函数中用于插值的算法是什么?

    我正在使用 Matlab Octaveimresize 对给定的二维数组重新采样的函数 我想了解如何使用特定的插值算法imresize works 我在Windows上使用八度 e g A 1 2 3 4 是一个二维数组 然后我使用命令 b
  • matlab中求和函数句柄

    Hi我试图对两个函数句柄求和 但它不起作用 例如 y1 x x x y2 x x x 3 x y3 y1 y2 我收到的错误是 对于 function handle 类型的输入参数 未定义函数或方法 plus 这只是一个小例子 实际上我实际
  • 小矩阵乘以大矩阵

    我试图将小矩阵 假设为 2x2 中的每个元素与大矩阵 假设为 4x4 中的每个位置逐个元素相乘 所以我想要 1 2 3 4 1 0 3 0 1 0 1 2 3 4 0 0 0 0 0 0 x 1 2 3 4 1 0 3 0 1 2 3 4
  • 给定三点计算仿射变换

    我有两张图像 并使用筛选找到了三个相似的二维点 我需要计算图像之间的仿射变换 不幸的是 我错过了讲座 而且那里的信息对我来说有点密集 计算这个 2x3 矩阵的一般方法是什么 我有 2x3 矩阵 x1 y1 x2 y2 x3 y3 中的点矩阵
  • 在Matlab中,是否可以终止脚本,但将其所有内部变量保存到工作区?

    我正在运行一个脚本 但它花费的时间太长 所以我想终止该脚本 然而 它计算了很多数据 我理想情况下不想扔掉这些数据 有没有替代方案ctrl C用什么将内部函数变量保存到工作区 理想情况下我正在寻找一个Matlab键盘快捷键如ctrl C 但如
  • 确定时间序列数据的 SOM(自组织映射)中的集群成员资格

    我也在做一个需要对时间序列数据进行聚类的项目 我正在使用在 MATLAB 中运行的 SOM 工具箱进行聚类 但遇到了以下问题 我们如何确定哪些数据属于哪个集群 SOM从数据集中随机选择数据样本 并为每个数据样本找到BMU 据我所知 SOM算
  • 使用循环绘制多个结果

    我想使用 for 循环绘制原始和窗口的结果 10 50 100 全部在一个图中这是我得到的情节 https i stack imgur com wAixM png below is my code Read data in data csv
  • MATLAB - 避免循环基于其他向量的元素创建矩阵

    假设我有向量x y z 长度n m l 我想创建一个细胞矩阵Q使用这些向量的元素 天真的人们可以像这样使用 for 循环 for i 1 n for j 1 m for k 1 l Q i j k someFunction x i y j
  • 一次设置多个字段/向单元结构添加新字段

    我有一个 1xn 结构 该结构包含一些带有数字单元格的字段 并非每个结构都具有相同的字段 所以我想将缺少的字段添加到结构中 但我没明白 Mimimal example I have same cells imported from csv

随机推荐

  • SpringBoot 集成 Swagger 3.0 和 knife4j 文档教程

    SpringBoot 项目集成 Swagger 3 0 文档 添加依赖 在 SpringBoot 项目中 在 pom 文件中添加 Swagger 3 0 的依赖
  • Node.js中的回调函数详解

    Node js中的回调函数详解 回调函数概述 回调函数定义 回调函数主要用途 回调函数用法 回调函数基本格式 简单的回调函数实例 执行顺序理解 回调函数实例 回调函数概述 回调函数在很多地方都有用到 本文主要介绍Node js的回调函数 主
  • spring:集成JDBC

    spring作为一站式框架 提供了控制层的 SpringMVC 和 持久层的 Spring JdbcTemplate 1 导入相关的jar包 pom xml mysql
  • tomcat 和 jboss的热部署(热发布)问题

    所谓的热部署 热发布 下面称为 热部署 就是说 在web工程发布之后 不可避免的 会遇到修改BUG的问题 现在的热部署就是为了解决这个问题 其功能就是说 在不停止web服务的同时 对jsp和java类进行修改 修改后的效果同时还能够在页面上
  • 改变python默认版本方法

    通过软链接命令 ln 此方法为系统级修改 先删除默认的Python软链接 sudo rm rf usr bin python 然后创建一个新的软链接指向需要的Python版本 sudo ln s usr bin python3 usr bi
  • 在idea中启动Vue项目报错Love-Swiper

    今天在重新配置idea时出现的这个错误 由于已经修改完毕 无法重现 大概报错为 Love Swiper 主要错误原因时没有安装vue的这个组件 使用以前语句即可 npm i vue awesome swiper save ignore sc
  • linux中python操作redis读取数据写入文件

    编写python脚本 扫描redis中终端在线集合和查询终端状态表 在redis中 终端在线集合是有序集合存储方式 成员是终端状态表名 终端状态表以hash方式存储 是一个string类型的field和value的映射表 1 脚本第一行是指
  • 常见伪代码指令及使用

    1 声明statement 1 1 Assignment statement赋值语句 variable expression e g将表达式3 4赋给变量result result 3 4 1 2 compound statements 复
  • 2维正态分布-矩阵表示-推导过程

  • 国内主流在用的10大后台UI框架,私活必备

    目录 vue Element Admin AdminLTE ant design pro tabler ng2 admin Gentelella iview admin blur admin vue admin material dashb
  • 今夜你会不会想起我

    夜渐渐的深了 疲惫了一天 还是觉得想写点什么 于是跳下床 把目光所及之处整理了一下 坐下来打开电脑 蓝光从电脑开关处不断的跳跃 随着windows熟悉的声音响起 输入密码 进入桌面 没有登录QQ 只是点开音乐播放器 单曲循环着一首老歌 一首
  • 强烈推荐

    一 前言 在开发中 我们经常会遇到这样一类需求 需要在网页上显示天气预报 股票数据或者实时排行榜单等实时变化的数据 对于此类需求 一种较为原始的做法就是让客户端每隔一段时间主动去轮询服务器 但这种做法有一个很大的弊端 如果客户端的数量很大
  • nginx中的脚本(理论篇)

    按照常规的打法或者按照常规的思路 针对变量的开发 也就是我们在ngx变量实现原理中介绍的那样 定义指令 设计结构体保存指令值 设计方法支持变量插入 利用自带的方法创建注册变量 利用自带的方法获取变量值等等 利用这些基本知识或功能点来开发变量
  • 密码设置十准则

    不论是互联网还是日常生活 我们都离不开密码设置 很多互联网用户都知道 即便是进行了密码设置 在很多时候我们也并不是那么安全 其实很多黑客之所以成功盗QQ 破解邮箱 往往就是因为我们的密码设置过于简单 如果自己设置的密码被别人猜到或破译 那么
  • vivado 亚稳态_【DNN Weaver FPGA实现】Vivado BRAM资源使用

    1 BRAM配置测试 我们知道Vivado中BRAM大小分为18K和36K两种 这两种BRAM在何种配置下会如何分配资源 需要进行一定的考量 由于Vivado可以配置生成任意bit数的IO位宽 所以我对BRAM配置进行了简单的实验 结果如下
  • AngularJS API

    1 AngularJS API概述 AngularJS 全局 API 用于执行常见任务的 JavaScript 函数集合 如 比较对象 迭代对象 转换对象 全局 API 函数使用 angular 对象进行访问 通用的 API 函数 API
  • 芝诺悖论

    我们先来看一下芝诺悖论的三个经典问题 阿基里斯是古希腊神话中的跑步健将 假设他和乌龟赛跑 他速度为乌龟的10倍 乌龟在前面10米出发 他在后面追 芝诺可以证明 阿基里斯永远不可能追上乌龟 当阿基里斯追到10米时 乌龟已经向前爬了1米 而当他
  • 业务场景——热点数据

    热点数据解决思路 识别热点 1 在代码层面做预热识别 比如给某个接口判断入参是否为热点数据的规则 比如redis过期时间1s 调一次 1但不更新过期时间 若增长量 gt 5则判为热数据 这种方法能更快速的识别热数据 但缺点是业务逻辑复杂 且
  • MySQL实现7天,15天,30天,90天用户留存数量查询

    如何计算用户留存率 新增用户留存率 新增用户中登录用户数 新增用户数 100 一般统计周期为天 新增用户数 在某个时间段 一般为第一整天 新登录应用的用户数 登录用户数 登录应用后至当前时间 至少登录过一次的用户数 第N日留存 指的是新增用
  • 标准BP神经网络以及MATLAB实现

    BP神经网络的结构可分成三部分 输入层 输入数据 隐藏层 处理数据 输出层 输出结果 其过程可以分为正向传播过程和反向传播过程 在正向传播过程中 BP神经网络通过隐层神经元对数据进行处理 从而输出相应结果 在反向传播过程中BP神经网络通过对