【MATLAB第57期】基于MATLAB的双隐含层BP神经网络回归预测模型(无工具箱版本及工具箱版本对比)

news2024/12/25 9:33:01

【MATLAB第57期】基于MATLAB的双隐含层BP神经网络回归预测模型(无工具箱版本及工具箱版本对比)

一、无工具箱版本

1.数据设置

数据为案例数据 。103行样本,7输入1输出数据。

2.参数设置

训练函数 梯度下降
HiddenUnit1Num=10;%隐层1结点数
HiddenUnit2Num=10;%隐层2节点数
MaxEpochs=20000;%最大训练次数
TF1 = 'logsig';TF2 = 'logsig'; TF3 = 'purelin';%各层传输函数,TF3为输出层传输函数
lr=0.003;%学习率
E0=0.05;%目标误差

3.代码展示

%--------------两个隐层的BP算法-------------%
clear all;
%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%%  导入数据
res = xlsread('数据集.xlsx');

%%  划分训练集和测试集
temp = randperm(103);
save temp temp
P_train = res(temp(1: 80), 1: 7)';
T_train = res(temp(1: 80), 8)';
M = size(P_train, 2);

P_test = res(temp(81: end), 1: 7)';
T_test = res(temp(81: end), 8)';
N = size(P_test, 2);

%%  数据归一化
[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);
t_test = mapminmax('apply', T_test, ps_output);


SamNum=size(p_train,2);%样本数
TestSamNum=size(p_test,2);%测试样本
HiddenUnit1Num=10;%隐层1结点数
HiddenUnit2Num=10;%隐层2节点数
InDim=size(p_train,1);%样本输入维数
OutDim=size(t_train,1);%样本输出维数
%根据目标函数获得样本输入输出

MaxEpochs=20000;%最大训练次数
lr=0.003;%学习率
E0=0.05;%目标误差
%产生扩展向量,及扩展样本输入%
W1Ex=[W1 B1];
W2Ex=[W2 B2];
W3Ex=[W3 B3];
SamInEx=[p_train' ones(SamNum,1)]';
for i=1:MaxEpochs
    %正向传播时第一隐层,第二隐层,及网络输出值%
    u=W1Ex*SamInEx;
    Hidden1Out=1./(1+exp(-u));
    Hidden1OutEx=[Hidden1Out' ones(SamNum,1)]';    %停止学习判断条件
    Error=t_train-NetworkOut;%是一个1*M的向量
    SSE=sum(Error.^2);%所有样本产生的误差之和
    if SSE<E0,break,end
    %计算反向传播误差
    Delta3=Error;%是一个横向量,包含样本的误差
    Dw3Ex=Delta3*Hidden2OutEx';
    for n=1:SamNum %对每一个样本分别计算
        Delta2=(W3'*Delta3(n)).*Hidden2Out(:,n).*(1-Hidden2Out(:,n));
        Delta2Store(:,n)=Delta2;
        Dw2Ex=Dw2Ex+Delta2*Hidden1OutEx(:,n)'; 
    end
    %更新权值

end
%% 测试集预测
v=size(p_test);
TestSamInEx=[p_test' ones(v(2),1)]';
u=W1Ex*TestSamInEx;
Hidden1Out=1./(1+exp(-u));
Hidden1OutEx=[Hidden1Out' ones(v(2),1)]';
u=W2Ex*Hidden1OutEx;
Hidden2Out=1./(1+exp(-u));
Hidden2OutEx=[Hidden2Out' ones(v(2),1)]';
TestNetworkOut=W3Ex*Hidden2OutEx;   %网络输出值
T_sim2 = mapminmax('reverse', TestNetworkOut, ps_output);

%%  均方根误差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);

%%  绘图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid

figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比';['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid

%%  相关指标计算
% 决定系数 R2
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test -  T_sim2)^2 / norm(T_test -  mean(T_test ))^2;

disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])

% 平均绝对误差 MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;

disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])

% 平均相对误差 MBE
mbe1 = sum(T_sim1 - T_train) ./ M ;
mbe2 = sum(T_sim2 - T_test ) ./ N ;

disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])

4.效果展示

在这里插入图片描述
在这里插入图片描述
训练集数据的R2为:0.9022
测试集数据的R2为:0.87266
训练集数据的MAE为:1.8189
测试集数据的MAE为:2.1658
训练集数据的MBE为:-0.00088469
测试集数据的MBE为:0.3059

二、有工具箱版本

1.数据设置

数据与无工具版本相同,数据顺序也相同。

2.参数设置

训练函数 trainlm
NodeNum1 = 10; % 隐层第一层节点数
NodeNum2=10; % 隐层第二层节点数
net.trainParam.epochs=20000;%训练次数设置
net.trainParam.goal=0.05;%训练目标设置
net.trainParam.lr=0.003;%学习率设置,应设置为较少值,太大虽然会在开始加快收敛速度,但临近最佳点时,会产生动荡,而致使无法收敛
TF1 = 'logsig';TF2 = 'logsig'; TF3 = 'purelin';%各层传输函数,TF3为输出层传输函数
%如果训练结果不理想,可以尝试更改传输函数,以下这些是各类传输函数

3.代码展示

%--------------两个隐层的BP算法-------------%

% BP 神经网络用于预测
%网络为7输入,1输出
% 103组数据,其中80组为正常训练数据,23组为测试数据
clear all;
%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%%  导入数据
res = xlsread('数据集.xlsx');

%%  划分训练集和测试集
temp = randperm(103);
load temp
P_train = res(temp(1: 80), 1: 7)';
T_train = res(temp(1: 80), 8)';
M = size(P_train, 2);

P_test = res(temp(81: end), 1: 7)';
T_test = res(temp(81: end), 8)';
N = size(P_test, 2);

%%  数据归一化
[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);
t_test = mapminmax('apply', T_test, ps_output);

%---------------------------------------------------
%数据归一化处理
%mapminmax函数默认将数据归一化到[0,1],调用形式如下
%[y,ps] =%mapminmax(x,ymin,ymax)
%x需归化的数据输入
%ymin,ymax为需归化到的范围,不填默认为归化到[-1,1]
%y归一化后的样本数据
%ps处理设置,ps主要在结果反归一化中需要调用,或者使用同样的settings归一化另外一组数据
%---------------------------------------------------
%---------------------------------------------------
% 设置网络参数
%--------------------------------------------------- 
NodeNum1 = 10; % 隐层第一层节点数
NodeNum2=10; % 隐层第二层节点数
TypeNum = 1; % 输出维数

TF1 = 'logsig';TF2 = 'logsig'; TF3 = 'purelin';%各层传输函数,TF3为输出层传输函数
%如果训练结果不理想,可以尝试更改传输函数,以下这些是各类传输函数
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin'; 

%注意创建BP网络函数newff()的参数调用

%---------------------------------------------------
% 设置训练参数
%--------------------------------------------------- 
net.trainParam.epochs=20000;%训练次数设置
net.trainParam.goal=0.05;%训练目标设置
net.trainParam.lr=0.003;%学习率设置,应设置为较少值,太大虽然会在开始加快收敛速度,但临近最佳点时,会产生动荡,而致使无法收敛
%---------------------------------------------------
% 指定训练函数
%---------------------------------------------------
% net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 动量梯度下降算法
%
% net.trainFcn = 'traingda'; % 变学习率梯度下降算法
% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法
%
% (大型网络的首选算法)
% net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小
%
% (共轭梯度算法)
% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves修正算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大
%
% (大型网络的首选算法)
%net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS算法小,比共轭梯度算法略大
%
% (中型网络的首选算法)
%net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快
% net.trainFcn = 'trainbr'; % 贝叶斯正则化算法
%
% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm'

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

%%  仿真测试
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test);

%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);

%%  均方根误差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);

%%  绘图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid

figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比';['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid

%%  相关指标计算
% 决定系数 R2
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test -  T_sim2)^2 / norm(T_test -  mean(T_test ))^2;

disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])

% 平均绝对误差 MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;

disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])

% 平均相对误差 MBE
mbe1 = sum(T_sim1 - T_train) ./ M ;
mbe2 = sum(T_sim2 - T_test ) ./ N ;

disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])

4.效果展示

在这里插入图片描述
在这里插入图片描述
训练集数据的R2为:1
测试集数据的R2为:0.94759
训练集数据的MAE为:3.6159e-07
测试集数据的MAE为:1.0637
训练集数据的MBE为:-2.0744e-07
测试集数据的MBE为:-0.43051

三、总结

因工具箱版本和无工具箱版本训练方法不同,以及有工具箱版本内置默认参数较为丰富 ,如连续验证最大失败数量、训练集再划分样本等等参数 ,且trainlm函数功能强大,用代码编写比较复杂 。故有工具版计算结果较好,收敛速度较快,使用方便,而无工具箱版本则更能直观的观察数据变化以及能够更直观体现BP神经网络计算原理。

四、代码获取

私信回复“57期”即可获取下载链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thinkphp+vue中小企业人事管理系统q731f

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin中小企业人事管理系统的主要开发目标如下&#xff1a; &…

性能测试之 cpu 篇

目录 1 前言&#xff1a; 2.1 cpu 介绍 2.1.1 上下文切换 2.1.2 运行队列 2.1.3 CPU 利用率 2.2 cpu 性能监控 2.2.1 vmstat 的使用 2.2.2 案例学习:持续的 CPU 利用率 2.2.3 案例学习:超负荷调度 2.2.4. mpstat 工具的使用 2.2.5. 案例学习: 未充分使用的处理量 2…

windows-文件夹-默认打开方式被修改-修改为资源管理器

文章目录 1.方法2.总结 1.方法 如果文件夹默认修改方式被修改&#xff0c;可以打开注册表 按windowsR输入&#xff1a; regedit然后修改注册表项 HKEY_CLASSES_ROOT\Directory\shell将其它值删除&#xff0c;键入默认的windows资源管理器 %systemroot%\explorer如下图所示&…

【PostgreSQL内核学习(五)—— 查询规划(预处理)】

查询规划——预处理 预处理提升子链接/子查询预处理表达式预处理HAVING子句 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主…

【网络教程】如何快速的解决WordPress“另一更新正在进行”的问题

文章目录 WordPress提示“另一更新正在进行”解决方案手动删除数据库记录使用插件WordPress提示“另一更新正在进行” 当我们在更新WordPress的插件或者升级WordPress时会出现后台提示“另一更新正在进行”,如下图 当我们点击更新后,出现下图提示 出现上述问题是由于在升级Wo…

瑞吉外卖开发笔记 七(redis、Spring Cache)

缓存优化 问题说明 用户数量多&#xff0c;系统访问量大频繁访问数据库&#xff0c;系统性能下降&#xff0c;用户体验差 环境搭建 maven坐标 在项目的pom.xm1文件中导入spring data redis的maven坐标: <dependency> <groupId>org.springframework.boot</g…

【Hello mysql】 mysql的视图

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的视图 介绍mysql的视图 基本概念基本使用创建视图修改视图删除视图 视图规则和限制总结 基本概念 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数…

基于帧差法和形态学处理的行驶车辆跟踪算法matlab仿真

目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 车辆跟踪是计算机视觉领域中的一个重要问题&#xff0c;它在交通监控、智能交通系统、自动驾驶等领域具有广泛的应用。本文介绍一种基于帧差法和形态学处…

maven安装配置、命令

maven: 是一个apache的一个开源项目&#xff0c;是一个项目管理工具&#xff0c;用来帮助开发者管理项目中的 jar&#xff08;mysql&#xff0c;jaskson&#xff0c;jwt&#xff09;&#xff0c;以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 为什么学习…

WEB:wife_wife

背景知识 JavaScript原型链污染 题目 先尝试一下&#xff0c;注册了管理员账号 这里不知道邀请码&#xff0c;所以没有勾选 答案不正确 这里借鉴其他大佬的思路 查看源代码才知道&#xff0c;后端没有数据库&#xff0c;所以sql注入是不可能的 // post请求的路径 app.pos…

Python open()函数之buffering缓冲区策略

文章目录 一、buffering 缓冲策略二、示例1. 可交互文本文件1.1 buffering-1&#xff0c;行缓冲&#xff08;默认&#xff09;1.2 buffering0&#xff0c;文本模式不支持关闭缓冲区1.3 buffering1&#xff0c;行缓冲&#xff0c;同 buffering-11.4 buffering>1&#xff0c;i…

使用开源项目并使用docker的方式搭建代理接口

目录 一、docker部署代理池子测试1、windows搭建代理池子测试2、linux上搭建代理池子测试 一、docker部署代理池子测试 这里使用的代理池子项目是崔大的git开源的项目&#xff0c;代理项目代码这里选择的安装方式是docker安装&#xff0c;这样即使本地没有redis环境&#xff0…

linux 在excel里面找内容

linux 在excel里面找内容 背景&#xff1a;在大数据行业中&#xff0c;很多数据源是excel文件&#xff0c;但是常常会出现查找excel内容找到对应的文件&#xff0c;所以制作了简单的shell脚本方便查询对应的excel文件 查看下面精简的内容即可&#xff0c;开箱即用 shell转换 …

python web开发之gunicorn 和 uWSGI 对比和配置

关于uWSGI的定义&#xff0c;在上一篇文章中写了&#xff0c;链接&#xff1a;WSGI/uwsgi/uWSGI详解 python开发常见的容器就只有的uWSGI和Gunicorn&#xff0c;本文介绍两者的区别和配置 1. 共同点 在架构上&#xff0c;nginx负责动态的转发和静态文件的直接访问&#xff0c;…

三、万物皆对象(2)

本章概要 类的创建 类型字段基本类型默认值方法使用 返回类型参数列表 程序编写 命名可见性使用其他组件static 关键字 小试牛刀 编译和运行 编码风格 类的创建 类型 如果一切都是对象&#xff0c;那么是什么决定了某一类对象的外观和行为呢&#xff1f;换句话说&#xff…

2023年华数杯数学建模竞赛ABC题思路代码论文资料汇总贴

下文包含&#xff1a;2023华数杯数学建模竞赛ABC题思路解析代码参考论文等及如何准备数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料&#xff0c;帮助大家取得好成绩。2023华数杯数学建模竞赛于8月3号下午6点正式开赛…

Origin科学绘图分析软件2023最新版下载安装教程

在科学研究和工程领域&#xff0c;数据的处理和分析是至关重要的一环&#xff0c;而Origin则是这方面的一款重要工具。Origin软件是由OriginLab公司开发的&#xff0c;主要用于各种科学数据的处理和分析&#xff0c;以及高质量的科学图形的创建。#乐享周末分享吧# 下载地址文末…

Spring Cloud Eureka 服务发现速度慢配置优化总结

文章目录 一、 Eureka-server 服务端缓存问题1.1 服务端缓存1.2 客户端从服务端获取实例数据的过程1.3 优化 二、客户端 Eureka-client 缓存导致2.1 Eureka客户端和服务端交互缓存2.2 Ribbon 缓存了EurekaClient的缓存2.3 优化 使用Eureka时&#xff0c;常常会发现服务发现慢&a…

Stable Diffusion 本地部署教程

1.前言&#xff1a; 最近看Stable Diffusion开源了&#xff0c;据说比Disco Diffusion更快&#xff0c;于是从git上拉取了项目尝试本地部署了&#xff0c;记录分享一下过程~ 这里是官网介绍&#xff1a;https://stability.ai/blog/stable-diffusion-public-release 2.必要前提…

jar 更新 jar包内的 class,以及如何修改class

一、提取Jar 内文件 #提取jar内的配置文件jar -xvf a.jar META-INF\plugin.xml-已解压: META-INF/plugin.xml#提取jar内的class文件&#xff0c; 提示&#xff1a;反编译为java文件&#xff0c;修改后再使用javac xxx.java编译为class&#xff0c;jar -xvf a.jar io.config.**…