matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等
%% 初始化程序
warning off % 关闭报警信息
close all % 关闭所有图窗
clear % 清空变量
clc % 清空命令行
setdemorandstream(172) %设置随机种子为1%% 读取数据
data = xlsread('Y.xlsx');
%% 划分训练集与测试集
temp = randperm(72); % 产生1到2000的乱序,用来随机抽取训练集和测试集
inputTrainDataset = data(temp(1:50), 1:20)'; % 前1900行数据训练,1到12列为输入变量
outputTrainDataset = data(temp(1:50), 21)'; % 前1900行数据训练,13列为输出目标inputTestDataset = data(temp(50:72), 1:20)'; % 1901到2000行数据训练,1到12列为输入变量
outputTestDataset = data(temp(50:72), 21)'; % 1901到2000行数据训练,13列为输出目标
%% 归一化处理
[inputn_train, input_ps] = mapminmax(inputTrainDataset, 0, 1);
inputn_test = mapminmax('apply', inputTestDataset, input_ps);
[outputn_train, output_ps] = mapminmax(outputTrainDataset, 0, 1);%% 确定神经网络结构
inputnode = 20; % 输入层的神经元节点数量
outputnode = 1; %输出层的神经元节点数量% 以下用于确定隐含层的神经元节点数量
bound = 3 : 1 : 15; % 在3到15范围内试凑隐含层的神经元节点数量
cnt = 1; % 迭代计数
for k = boundnet=newff(inputn_train,outputn_train,k,{'tansig','purelin'},'trainlm');net.trainParam.epochs=1000; % 训练次数net.trainParam.lr=0.01; % 学习速率net.trainParam.goal=1e-5; % 训练目标最小误差net.trainParam.showWindow = 0; % 关闭仿真界面net=train(net,inputn_train,outputn_train); %开始训练model_out = sim(net, inputn_train); % 训练集的归一化预测结果e(cnt) = mean((model_out - outputn_train).^2); % 训练集仿真的根均方误差disp(['隐含层节点数量为: ', num2str(k), ', 相应的训练集归一化根均方误差(RMSE)值为: ', num2str(e(cnt))])cnt = cnt + 1; % 迭代次数+1
end
hiddennode = bound(find(e == min(e), 1)); % 找到根均方误差最小时对应的最少隐含层节点数量,将之当做最优隐含层节点
disp(['最佳的隐含层节点数量为: ', num2str(hiddennode), ', 相应的训练集归一化根均方误差(RMSE)值最小, 为: ', num2str(e((find(e == min(e), 1))))])%% 建立模型
net=newff(inputn_train,outputn_train,hiddennode,{'tansig','purelin'},'trainlm');
net.trainParam.epochs=1000; % 训练次数
net.trainParam.lr=0.01; % 学习速率
net.trainParam.goal=1e-5; % 训练目标最小误差
%开始训练
net=train(net,inputn_train,outputn_train);
%% 预测和反归一化
model_out1 = sim(net, inputn_train); % 训练集的归一化预测结果
model_out2 = sim(net, inputn_test); % 测试集的归一化预测结果
predictTrainDataset = mapminmax('reverse', model_out1, output_ps); % 反归一化训练集预测结果为原始数量级
predictTestDataset = mapminmax('reverse', model_out2, output_ps); % 反归一化测试集预测结果为原始数量级
%% 分析误差
disp(' ')
disp('训练集误差计算如下: ')
MSE = mean((outputTrainDataset - predictTrainDataset).^2);
disp(['均方误差MSE = ', num2str(MSE)])
MAE = mean(abs(outputTrainDataset - predictTrainDataset));
disp(['平均绝对误差MAE = ', num2str(MAE)])
RMSE = sqrt(MSE);
disp(['根均方误差RMSE = ', num2str(RMSE)])
MAPE = mean(abs((outputTrainDataset - predictTrainDataset)./outputTrainDataset));
disp(['平均绝对百分比误差MAPE = ', num2str(MAPE*100), '%'])
R = corrcoef(outputTrainDataset, predictTrainDataset);
R2 = R(1, 2)^2;
disp(['拟合优度R2 = ', num2str(R2)])
disp(' ')
disp('测试集误差计算如下: ')
MSE_test = mean((outputTestDataset - predictTestDataset).^2);
disp(['均方误差MSE = ', num2str(MSE_test)])
MAE_test = mean(abs(outputTestDataset - predictTestDataset));
disp(['平均绝对误差MAE = ', num2str(MAE_test)])
RMSE_test = sqrt(MSE_test);
disp(['根均方误差RMSE = ', num2str(RMSE_test)])
MAPE_test = mean(abs((outputTestDataset - predictTestDataset)./outputTestDataset));
disp(['平均绝对百分比误差MAPE = ', num2str(MAPE_test*100), '%'])
R_test = corrcoef(outputTestDataset, predictTestDataset);
R2_test = R_test(1, 2)^2;
disp(['拟合优度R2 = ', num2str(R2_test)])
%% 对结果作图
% 训练集
figure
plot(outputTrainDataset, 'b*-', 'LineWidth', 0.8)
hold on
plot(predictTrainDataset, 'ro-', 'LineWidth', 0.8)
grid on
xlabel('训练样本序号')
ylabel('目标')
legend('实际值', '预测值')
title({'BP神经网络预测训练集预测值和实际值对比图', ['根均方误差RMSE = ', num2str(RMSE), '拟合优度R2 = ', num2str(R2)]})figure
plot(outputTrainDataset - predictTrainDataset, 'b*-', 'LineWidth', 0.8)
grid on
xlabel('训练样本序号')
ylabel('预测偏差')
legend('误差')
title({'BP神经网络预测训练集预测误差图', ['平均绝对百分比误差MAPE = ', num2str(MAPE*100), '%']})% 测试集
figure
plot(outputTestDataset, 'b*-', 'LineWidth', 0.8)
hold on
plot(predictTestDataset, 'ro-', 'LineWidth', 0.8)
grid on
xlabel('测试样本序号')
ylabel('目标')
legend('实际值', '预测值')
title({'BP神经网络预测测试集预测值和实际值对比图', ['根均方误差RMSE = ', num2str(RMSE_test), '拟合优度R2 = ', num2str(R2_test)]})figure
plot(outputTestDataset - predictTestDataset, 'b*-', 'LineWidth', 0.8)
grid on
xlabel('测试样本序号')
ylabel('预测偏差')
legend('误差')
title({'BP神经网络预测测试集预测误差图', ['平均绝对百分比误差MAPE = ', num2str(MAPE_test*100), '%']})% 获取输入层到第一个隐藏层的权重
weights_input_to_hidden = net.IW{1,1};% 显示权重矩阵
disp('Input to hidden layer weights:');
disp(weights_input_to_hidden);
%% 参数
% 获取输入层到第一个隐藏层的权重
weights_input_to_hidden = net.IW{1,1};
disp('Input to hidden layer weights:');
disp(weights_input_to_hidden);
% 获取第一个隐藏层到输出层的权重
weights_hidden_to_output = net.LW{2,1};
disp('Hidden to output layer weights:');
disp(weights_hidden_to_output);
% 获取输入层的偏置
biases_output_layer = net.b{1};
disp('Input Layer Biases:');
disp(biases_output_layer);
% 获取隐藏层的偏置
biases_output_layer = net.b{2};
disp('hidden Layer Biases:');
disp(biases_output_layer);
以下是对上述代码功能的详细解释:
- 初始化部分:
warning off
:关闭报警信息,避免一些不必要的警告信息干扰程序的运行。close all
:关闭所有打开的图形窗口,确保程序开始时处于一个干净的图形环境。clear
:清空工作区中的变量,防止之前的变量影响当前程序的运行。clc
:清空命令行窗口,使命令行更加清晰。setdemorandstream(172)
:设置随机种子为 172,确保程序运行结果的可重复性,使得随机过程在多次运行时产生相同的结果。
- 数据读取部分:
data = xlsread('Y.xlsx')
:从名为Y.xlsx
的 Excel 文件中读取数据。
- 数据集划分部分:
temp = randperm(72)
:生成一个 1 到 72 的随机排列序列,用于随机抽取训练集和测试集。inputTrainDataset = data(temp(1:50), 1:20)'
:将数据的前 50 个随机索引对应的行的第 1 到 20 列作为输入训练集,并进行转置。outputTrainDataset = data(temp(1:50), 21)'
:将数据的前 50 个随机索引对应的行的第 21 列作为输出训练集,并进行转置。inputTestDataset = data(temp(50:72), 1:20)'
:将数据的第 50 到 72 个随机索引对应的行的第 1 到 20 列作为输入测试集,并进行转置。outputTestDataset = data(temp(50:72), 21)'
:将数据的第 50 到 72 个随机索引对应的行的第 21 列作为输出测试集,并进行转置。
- 归一化处理部分:
[inputn_train, input_ps] = mapminmax(inputTrainDataset, 0, 1)
:将输入训练集的数据归一化到 0 到 1 的范围,并存储归一化的结果和归一化参数。inputn_test = mapminmax('apply', inputTestDataset, input_ps)
:使用训练集的归一化参数对输入测试集进行归一化处理。[outputn_train, output_ps] = mapminmax(outputTrainDataset, 0, 1)
:将输出训练集的数据归一化到 0 到 1 的范围,并存储归一化的结果和归一化参数。
- 神经网络结构确定部分:
inputnode = 20
:设置输入层的神经元节点数量为 20。outputnode = 1
:设置输出层的神经元节点数量为 1。- 对隐含层的神经元节点数量进行试凑:
bound = 3 : 1 : 15
:设置隐含层神经元节点数量的试凑范围从 3 到 15。- 使用
for
循环遍历bound
中的每个节点数量k
:net=newff(inputn_train,outputn_train,k,{'tansig','purelin'},'trainlm')
:创建一个新的前馈神经网络,激活函数分别为tansig
和purelin
,训练算法为trainlm
。net.trainParam.epochs=1000
:设置训练次数为 1000 次。net.trainParam.lr=0.01
:设置学习速率为 0.01。net.trainParam.goal=1e-5
:设置训练目标最小误差为 1e-5。net.trainParam.showWindow = 0
:关闭仿真界面。net=train(net,inputn_train,outputn_train)
:使用输入训练集和输出训练集对网络进行训练。model_out = sim(net, inputn_train)
:使用训练好的网络对输入训练集进行仿真,得到归一化预测结果。e(cnt) = mean((model_out - outputn_train).^2)
:计算训练集的归一化根均方误差,并存储在e
数组中。disp(['隐含层节点数量为: ', num2str(k), ', 相应的训练集归一化根均方误差(RMSE)值为: ', num2str(e(cnt))])
:显示当前隐含层节点数量及其对应的训练集的归一化根均方误差。
hiddennode = bound(find(e == min(e), 1))
:找到使根均方误差最小的隐含层节点数量,作为最优的隐含层节点数量。disp(['最佳的隐含层节点数量为: ', num2str(hiddennode), ', 相应的训练集归一化根均方误差(RMSE)值最小, 为: ', num2str(e((find(e == min(e), 1))))]
:显示最佳的隐含层节点数量及其最小的根均方误差。
- 模型建立部分:
net=newff(inputn_train,outputn_train,hiddennode,{'tansig','purelin'},'trainlm')
:使用最优的隐含层节点数量建立最终的神经网络。net.trainParam.epochs=1000
:设置训练次数为 1000 次。net.trainParam.lr=0.01
:设置学习速率为 0.01。net.trainParam.goal=1e-5
:设置训练目标最小误差为 1e-5。net=train(net,inputn_train,outputn_train)
:使用输入训练集和输出训练集对最终的神经网络进行训练。
- 预测和反归一化部分:
model_out1 = sim(net, inputn_train)
:使用训练好的网络对输入训练集进行仿真,得到归一化预测结果。model_out2 = sim(net, inputn_test)
:使用训练好的网络对输入测试集进行仿真,得到归一化预测结果。predictTrainDataset = mapminmax('reverse', model_out1, output_ps)
:将训练集的归一化预测结果反归一化到原始数据范围。predictTestDataset = mapminmax('reverse', model_out2, output_ps)
:将测试集的归一化预测结果反归一化到原始数据范围。
- 误差分析部分:
- 计算训练集的各种误差指标:
MSE = mean((outputTrainDataset - predictTrainDataset).^2)
:计算训练集的均方误差。MAE = mean(abs(outputTrainDataset - predictTrainDataset))
:计算训练集的平均绝对误差。RMSE = sqrt(MSE)
:计算训练集的根均方误差。MAPE = mean(abs((outputTrainDataset - predictTrainDataset)./outputTrainDataset))
:计算训练集的平均绝对百分比误差。R = corrcoef(outputTrainDataset, predictTrainDataset)
:计算训练集实际值和预测值的相关系数矩阵。R2 = R(1, 2)^2
:计算训练集的拟合优度。
- 计算测试集的各种误差指标:
MSE_test = mean((outputTestDataset - predictTestDataset).^2)
:计算测试集的均方误差。MAE_test = mean(abs(outputTestDataset - predictTestDataset))
:计算测试集的平均绝对误差。RMSE_test = sqrt(MSE_test)
:计算测试集的根均方误差。MAPE_test = mean(abs((outputTestDataset - predictTestDataset)./outputTestDataset))
:计算测试集的平均绝对百分比误差。R_test = corrcoef(outputTestDataset, predictTestDataset)
:计算测试集实际值和预测值的相关系数矩阵。R2_test = R_test(1, 2)^2
:计算测试集的拟合优度。
- 计算训练集的各种误差指标:
- 结果作图部分:
- 对训练集的实际值和预测值进行绘图,并显示误差信息。
- 对测试集的实际值和预测值进行绘图,并显示误差信息。
- 参数获取部分:
weights_input_to_hidden = net.IW{1,1}
:获取输入层到第一个隐藏层的权重矩阵。weights_hidden_to_output = net.LW{2,1}
:获取第一个隐藏层到输出层的权重矩阵。biases_output_layer = net.b{1}
:获取输入层的偏置。biases_output_layer = net.b{2}
:获取隐藏层的偏置。
总的来说,该程序是一个使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理(划分数据集和归一化)、神经网络结构的确定(试凑隐含层节点数量)、训练、预测、结果反归一化、误差分析和结果可视化,并展示了神经网络的部分权重和偏置信息。
相关文章:
matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等
%% 初始化程序 warning off % 关闭报警信息 close all % 关闭所有图窗 clear % 清空变量 clc % 清空命令行 setdemorandstream(172) %设置随机种子为1%% 读取数据 data xlsread(Y.xlsx); %% 划分训练集…...

systemd-networkd NetworkManager 介绍
systemd-networkd 和 NetworkManager 的详细介绍 systemd-networkd 和 NetworkManager 都是 Linux 系统中常用的网络管理工具,但它们的设计目标和使用场景不同。以下是它们的详细介绍、功能、使用场景和差异。 1. systemd-networkd systemd-networkd 是一个由 syst…...

本地部署项目管理工具 Leantime 并实现外部访问
Leantime 是一款开源 AI 项目。它可以在本地直接运行大语言模型 LLM、生成图像、音频等。直接降低了用户使用AI的门褴。本文将详细的介绍如何利用 Docker 在本地部署 Leantime 并结合路由侠实现外网访问本地部署的 Leantime 。 第一步,本地部署安装 Leantime 1&am…...
PHP cURL 函数初学者完全指南
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...

C#中的Array数组,List集合和ArrayList集合--07
目录 一.Array数组概念的简单理解 1.数组的初始化 2.数组的长度 3.数组的克隆和复制 4.数组的清空 5.数组的查找 6.数组的逆转 7.数组的拓展和缩减 8.数组的比较 9.数组的合并 10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等 二.Array数组进阶 1.二…...

基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
在使用 PySide6 进行开发时,管理应用程序的资源(如图标、图片、字体、样式表、音视频等)是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc,它能够将资源文件(.qrc)编译成 Python 模块,然后…...

硬件实用技巧:TPS54331DR横杠标识识别1引脚
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/145116969 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...

《C++11》nullptr介绍:从NULL说起
在C11之前,我们通常使用NULL来表示空指针。然而,NULL在C中有一些问题和限制,这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中,NULL实际上是一个整数0,而不是一个真正的…...

自然语言处理基础:全面概述
自然语言处理基础:全面概述 什么是NLP及其重要性、NLP的核心组件、NLU与NLG、NLU与NLG的集成、NLP的挑战以及NLP的未来 自然语言处理(NLP)是人工智能(AI)中最引人入胜且具有影响力的领域之一。它驱动着我们日常使用的…...
网络安全的几种攻击方法
攻击方法 挂马: 就是在别人的网站文件里面放入网页木马或者是将代码潜入到对方正常的网页文件里,以使浏览者中马。 挖洞: 指漏洞挖掘。 加壳: 就是利用特殊的算法,将EXE可执行程序或者DLL动态连接库文件的编码进行改变(比如实现压缩、加密&a…...

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)
参考文章:Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具,放到C盘根目录, 2.1 打开windows Powershell(WinX),下边那个最好。 输入两条指令&a…...

【pycharm发现找不到python打包工具,且无法下载】
发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …...

C++ QT 自绘表盘
文章目录 效果图代码 效果图 代码 代码没什么好说的,直接上源码.h #pragma once#include <QWidget> #include <QPainter> #include <QResizeEvent> #include <QtMath> #include <QCoreApplication>class DialPlateWidget : public …...

数据科学与数据工程:两者的区别与交集
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...

MAC AndroidStudio模拟器无网络
先确认PC端是正常访问网络的; 模拟器端修改Wifi设置:设置 - 网络和互联网 - WALN设置 按照上图修改; IP设置:从DHCP修改为静态,IP地址:10.0.2.16 ,网关:10.0.2.2 , DNS…...
PHP语言的多线程编程
PHP语言的多线程编程 引言 在现代Web开发中,PHP以其简洁和易用性广受欢迎。它常用于构建动态网站和应用程序。然而,PHP本身是单线程的,这意味着它在处理多个任务时可能会受到性能限制。随着互联网的发展,对高并发、高可用性和实…...

当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限
在自动化控制技术日新月异的当下,Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议,而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…...

浅析大语言模型安全和隐私保护国内外标准和政策
过去两年,大模型技术已经普及并逐步渗透到各行各业,2025年注定是大模型应用井喷式发展的一年,AI在快速发展的同时,其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载:600多…...
OpenCV相机标定与3D重建(54)解决透视 n 点问题(Perspective-n-Point, PnP)函数solvePnP()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 根据3D-2D点对应关系找到物体的姿态。 cv::solvePnP 是 OpenCV 库中的一个函数,用于解决透视 n 点问题(Perspective-n-Po…...

Chatper 4: Implementing a GPT model from Scratch To Generate Text
文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture4.2 Normalizing activations with layer normalization4.3 Implementing a feed forward network with GELU activations4.4 Adding shortcut connections4.5 Connecting at…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...