首页 > 其他分享 >数学建模_BP神经网络模型(多输入单输出)回归预测模型+Matlab代码包教会使用,直接替换数据即可

数学建模_BP神经网络模型(多输入单输出)回归预测模型+Matlab代码包教会使用,直接替换数据即可

时间:2024-11-08 15:44:15浏览次数:3  
标签:num 训练 模型 train BP Matlab 归一化 test net

基于BP神经网络的多输入单输出回归预测模型简介

该模型使用了BP神经网络Backpropagation Neural Network进行多输入单输出的回归预测。BP神经网络是一种常见的多层前馈神经网络,通过反向传播算法来优化权重和偏置,从而最小化预测误差。

具体模型原理就不再细说了,需要可以翻看我主页另外的BP会有详细一点的过程!

以下是对该模型及其代码的部分解读:


模型原理概述

BP神经网络是一种前馈型神经网络,具有输入层、隐藏层和输出层。该网络通过逐层的信号传播来进行预测,并通过反向传播算法(BP算法)来更新权重和偏置,使预测误差最小化。在回归预测任务中,BP神经网络通过学习输入特征与目标变量之间的映射关系,从而实现对连续性输出的预测。

模型结构
  • 输入层:接受多个输入特征,在本代码中包含若干特征变量。
  • 隐藏层:用于捕捉数据的非线性关系,神经元个数由 hiddens 参数控制。本代码中隐藏层有4个神经元,激活函数为tansig(双曲正切函数),用于引入非线性。
  • 输出层:输出层只有一个神经元,用于单输出预测。激活函数采用线性函数 purelin,适合回归任务。

代码讲解

1. 数据加载和归一化
res = readmatrix('回归数据.xlsx');  % 导入数据
X = res(:,1:end-1);                 % 输入特征
Y = res(:,end);                     % 输出目标
x = mapminmax(X', 0, 1);            % 归一化输入特征
[y, psout] = mapminmax(Y', 0, 1);   % 归一化输出目标
  • 数据导入:从 回归数据.xlsx 文件中读取数据,X 是输入特征,Y 是目标变量。
  • 归一化:将输入和输出数据映射到[0, 1]区间,避免不同特征量级差异对模型带来的影响,并加速训练过程。mapminmax 函数可以实现归一化,psout 保存归一化参数,用于后续反归一化处理。
2. 划分训练集和测试集
num = size(res,1);   % 样本总数
state = randperm(num); % 打乱样本顺序
ratio = 0.8;          % 训练集占比
train_num = floor(num * ratio);

x_train = x(:, state(1:train_num));
y_train = y(state(1:train_num));
x_test = x(:, state(train_num+1:end));
y_test = y(state(train_num+1:end));
  • 随机打乱样本:通过 randperm 打乱样本顺序,防止数据顺序性对训练带来的偏差。
  • 划分数据集:设定80%为训练集,20%为测试集,以确保模型既能学习数据又能测试泛化能力。
3. 创建并配置神经网络
hiddens = 4;  % 隐藏层神经元数量
tf = {'tansig', 'purelin'};  % 隐藏层激活函数和输出层激活函数
net = newff(x_train, y_train, hiddens, tf);
  • 网络结构:创建一个前馈神经网络 net,隐藏层包含4个神经元,激活函数使用 tansig;输出层为线性激活函数 purelin,符合回归任务需求。
net.trainParam.epochs = 1000;    % 最大训练迭代次数
net.trainParam.goal = 1e-6;      % 误差目标
net.trainParam.lr = 0.01;        % 学习率
  • 设置训练参数
    • epochs:设置最大迭代次数为1000。
    • goal:设定误差目标为 1e-6,达到该误差则停止训练。
    • lr:学习率,控制每次权重更新的步长。
4. 训练神经网络
net = train(net, x_train, y_train);  % 使用训练集数据训练网络
  • 网络训练:使用 train 函数进行训练,通过反向传播算法调整权重,使得预测结果与实际值尽可能接近。
5. 仿真测试与预测
re1 = sim(net, x_train);  % 训练集仿真预测
re2 = sim(net, x_test);   % 测试集仿真预测
  • 仿真预测:使用训练好的神经网络对训练集和测试集数据进行仿真,得到预测值。
6. 数据反归一化
pre1 = mapminmax('reverse', re1, psout);  % 反归一化训练集预测结果
pre2 = mapminmax('reverse', re2, psout);  % 反归一化测试集预测结果
  • 反归一化:将归一化后的预测结果恢复到原始数据的尺度,使得预测值与实际值可直接比较。
7. 计算模型性能指标
% 均方根误差
error1 = sqrt(sum((pre1 - Y_train).^2) ./ train_num);
error2 = sqrt(sum((pre2 - Y_test).^2) ./ test_num);

% R2 指数
R1 = 1 - norm(Y_train - pre1)^2 / norm(Y_train - mean(Y_train))^2;
R2 = 1 - norm(Y_test - pre2)^2 / norm(Y_test - mean(Y_test))^2;

% 平均绝对误差(MAE)
mae1 = mean(abs(Y_train - pre1));
mae2 = mean(abs(Y_test - pre2));
  • 均方根误差(RMSE):衡量预测值与实际值之间的差异,越小越好。
  • :表示模型的拟合优度,越接近1,表示模型拟合效果越好。
  • 平均绝对误差(MAE):反映预测值与实际值的平均绝对差异,越小表示模型性能越好。
8. 结果展示与可视化
  • 训练集与测试集的预测对比图:展示预测值与实际值的对比,直观了解模型效果。
  • 误差图:展示预测值和实际值之间的百分比误差。
  • 拟合图:展示训练集和测试集的回归拟合情况,通过 plotregression 函数直观展示拟合效果。
figure
plot(1: train_num, Y_train, 'r-^', 1: train_num, pre1, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('训练集预测结果对比')

figure
plot(1: test_num, Y_test, 'r-^', 1: test_num, pre2, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('测试集预测结果对比')

总结

此基于BP神经网络的回归预测模型流程如下:

  1. 数据预处理:归一化数据,确保不同量纲的特征值不影响训练。
  2. 构建网络:创建一个多层前馈神经网络,设置隐藏层和输出层的激活函数。
  3. 模型训练:使用训练集数据优化网络权重,通过迭代训练最小化预测误差。
  4. 预测与反归一化:对训练集和测试集进行预测,将结果反归一化到原始尺度。
  5. 性能评估与可视化:通过RMSE、R²、MAE等指标评价模型效果,并通过图形可视化展示模型预测结果。

该模型适用于多输入单输出的回归任务,能够捕捉输入特征与输出目标之间的非线性关系,实现较好的预测效果。

Matlab代码手把手教运行

为了帮助更多的萌新更快上手数学建模建等竞赛,这里直接手把手教会如何直接使用本文中的BP神经网络代码:

close all;clear;clc;
rng(2222)

%%  导入数据
res = readmatrix('回归数据.xlsx');

%%  数据归一化 索引
X = res(:,1:end-1);
Y = res(:,end);
x = mapminmax(X', 0, 1);
%保留归一化后相关参数
[y, psout] = mapminmax(Y', 0, 1);

%%  划分训练集和测试集
num = size(res,1);
state = randperm(num);
ratio = 0.8;
train_num = floor(num*ratio);

x_train = x(:,state(1: train_num));
y_train = y(state(1: train_num));

x_test = x(:,state(train_num+1: end));
y_test = y(state(train_num+1: end));

hiddens = 4; %隐藏层个数
tf = {'tansig', 'purelin'};
net = newff(x_train, y_train, hiddens,tf);

%%  设置参数
net.trainParam.epochs = 1000;     
net.trainParam.goal = 1e-6;     
net.trainParam.lr = 0.01;       

net= train(net, x_train, y_train);

%%  仿真测试
re1 = sim(net, x_train);
re2 = sim(net, x_test );


Y_train = Y(state(1: train_num))';
Y_test = Y(state(train_num+1:end))';

pre1 = mapminmax('reverse', re1, psout);
pre2 = mapminmax('reverse', re2, psout);

error1 = sqrt(sum((pre1 - Y_train).^2) ./ trainnum);
error2 = sqrt(sum((pre2 - Y_test).^2) ./ testnum);

% R2
R1 = 1 - norm(Y_train - pre1)^2 / norm(Y_train - mean(Y_train))^2;
R2 = 1 - norm(Y_test -  pre2)^2 / norm(Y_test -  mean(Y_test ))^2;

%  MAE
mae1 = mean(abs(Y_train - pre1 ));
mae2 = sum(abs(pre2 - Y_test )) ./ testnum ;

disp('训练集预测精度指标如下:')
disp(['训练集数据的R2为:', num2str(R1)])
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['训练集数据的RMSE为:', num2str(error1)])
disp('测试集预测精度指标如下:')
disp(['测试集数据的R2为:', num2str(R2)])
disp(['测试集数据的MAE为:', num2str(mae2)])
disp(['测试集数据的RMSE为:', num2str(error2)])

figure
plot(1: trainnum, Y_train, 'r-^', 1: trainnum, pre1, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('训练集预测结果对比')

figure
plot(1: testnum, Y_test, 'r-^', 1: testnum, pre2, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('测试集预测结果对比')

figure
plot((pre1 - Y_train )./Y_train, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('训练集百分比误差曲线')

figure
plot((pre2 - Y_test )./Y_test, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('测试集百分比误差曲线')

figure;
plotregression(Y_train, pre1, '训练集', ...
               Y_test, pre2, '测试集');
set(gcf,'Toolbar','figure');

回归数据.xlsx:

x1x2x3x4x5y
3.0362265613.881217.47568.4348316.8209348.47907612
4.3916588450.278231.623160.4768310.720564.12185185
5.2485978634.475232.985468.7401111.5485667.67148734
5.1212367253.694244.469265.3606114.3619159.32753057
4.6490218647.125268.305263.8013212.0485767.98570391
4.2672095445.033257.770161.689977.05562546.47506598
4.8045125848.875234.096867.144677.65613447.18442579
3.8258036583.543270.757561.4445316.6565454.0487296
4.7875349546.304225.827967.8935111.4366569.90372309
5.5807975481.803287.904362.2043211.2692747.32012957
3.6589199482.116278.809361.2021712.3741871.68429695
3.8299859128.034225.218764.8142316.7046168.18735427
5.2957856804.695282.694767.1343413.6187158.0309376
5.5543085340.983277.283369.394667.80435248.77931811
3.1595798717.524209.913366.7386216.30867.56410903

前几列为特征,最后一列为因变量,直接替换即可无需更改代码!

标签:num,训练,模型,train,BP,Matlab,归一化,test,net
From: https://blog.csdn.net/2401_82466443/article/details/143589224

相关文章

  • 改进的蜣螂算法(IDBO)优化长短期记忆神经网络原理及MATLAB代码复现
    目录0引言1数学模型2模型性能可视化3MATLAB代码3.1伪代码程序图3.2IDBO-LSTM0引言针对DBO全局探索能力不足、易陷入局部最优以及收敛精度不理想等问题,有学者提出了一种混合多策略改进的蜣螂优化算法(IDBO)。该算法采用混沌映射结合随机反向学习策略初始化种群提......
  • 改进的蜣螂算法(IDBO)优化支持向量机原理及MATLAB代码复现
    目录0引言1数学模型2模型性能可视化3MATLAB代码3.1伪代码程序图3.2IDBO-SVR、IDBO-SVM0引言针对DBO全局探索能力不足、易陷入局部最优以及收敛精度不理想等问题,有学者提出了一种混合多策略改进的蜣螂优化算法(IDBO)。该算法采用混沌映射结合随机反向学习策略初始......
  • 改进的蜣螂算法(IDBO)优化BP神经网络原理及MATLAB代码复现
    目录0引言1数学模型2模型性能可视化3MATLAB代码3.1伪代码程序图3.2IDBO-BP0引言针对DBO全局探索能力不足、易陷入局部最优以及收敛精度不理想等问题,有学者提出了一种混合多策略改进的蜣螂优化算法(IDBO)。该算法采用混沌映射结合随机反向学习策略初始化种群提高......
  • 基于YOLOV8模型和CCPD数据集的车牌目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    摘要:基于YOLOV8模型和CCPD数据集的车牌目标检测系统可用于日常生活中检测与定位车牌目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭建前端......
  • 好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
    好未来,前身学而思,于2010年在美国纽约证券交易所上市。公司积极将大模型研究应用于教学产品中,近期推出了数学领域的千亿级大模型。在大模型的背景下,存储系统需处理巨量数据和复杂文件操作,要求支持高并发和高吞吐量。此外,还需应对版本管理、模型训练性能优化和多云分发的挑战。......
  • 首个Mamba+Transformer多模态大模型
    扩展多模态大语言模型(MLLMs)的长上下文能力对于视频理解、高分辨率图像理解以及多模态智能体至关重要。这涉及一系列系统性的优化,包括模型架构、数据构建和训练策略,尤其要解决诸如随着图像增多性能下降以及高计算成本等挑战。该团队将模型架构调整为Mamba和Transformer......
  • 构建AI大模型应用技术栈有哪些?
    摘要:随着人工智能技术的飞速发展,AI大模型已经成为推动各行各业技术革新的关键力量。本文将深入探讨AI大模型的核心技术栈的构建,以及不同技术组件的关键作用。AI大模型应用的核心技术栈各组件的关键作用基于大模型的应用和普通应用的区别01—AI大模型应用的核心技术栈......
  • 【NLP】使用 SpaCy 通过 LLM 合成数据微调 NER 模型
    在我们之前的文章“使用SpaCy、ollama创建用于命名实体识别的合成数据集”中,我们探讨了如何使用Qwen生成合成数据,以自动化命名实体识别(NER)的注释过程。通过利用合成数据,我们能够高效地准备来自SmoothNLP金融新闻数据集  的高质量数据集。现在,在这篇文章中,我们将更进......
  • 解析lightgbm的txt模型文件
    根据近期的github方案,实现对txt格式的pmml文件的加载添加依赖<dependency><groupId>org.jpmml</groupId><artifactId>pmml-lightgbm</artifactId><version>1.5.4</version></dependency><dependency><groupId>......
  • 【老生谈算法】matlab实现可变指数遗忘的扩展递归最小二乘法(VEX-RLS)——递归最小二乘
    MATLAB实现可变指数遗忘的扩展递归最小二乘法(VEX-RLS)1、文档下载:本算法完整讲解和全套实现源码见下资源,有需要的朋友可以点击进行下载说明文档(点击下载)本算法文档【老生谈算法】Matlab实现可变指数遗忘的扩展递归最小二乘法(VEX-RLS)及其应用更多matlab算法原理及源码详......