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…...
潮州东方轻奢风全屋高定找哪家
开篇引言根据《2026年中国全屋定制行业发展报告》,潮州市全屋定制市场规模同比增长38%,其中全屋高端定制细分市场同比增长52%。目前,潮州市家庭全屋定制需求占比72%,高端定制需求占比45%。为了帮助潮州市消费者选择合规、靠谱、差…...
钱钟书《围城》第1-5章阅读笔记:一场关于人生困境的提前预演
前言 钱钟书先生的《围城》被誉为"新儒林外史",是中国现代文学史上风格独特的讽刺经典。这部创作于20世纪40年代的长篇小说,以抗战初期为背景,通过主人公方鸿渐的人生轨迹,深刻揭示了知识分子群体的精神困境与人性弱点。…...
Postgresql基础实践教程(九)
⭐️⭐️⭐️⭐️⭐️ 完整数据详见 练习数据免费 ⭐️⭐️⭐️⭐️⭐️ 七十二、WITH查询(公用表表达式CTE) 1. SELECT 中的 WITH 2. 递归查询 3. 公用表表达式的物化 4. WITH中的数据修改语句 WITH提供了一种在主查询中写辅助语句的方法。这些语…...
LizzieYzy:你的智能围棋教练,让AI分析变得简单有趣 [特殊字符]
LizzieYzy:你的智能围棋教练,让AI分析变得简单有趣 🎯 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 还在为复盘找不到关键点而烦恼吗?想提升棋力却…...
Qri高级功能:如何使用JSON Schema验证和描述数据集结构
Qri高级功能:如何使用JSON Schema验证和描述数据集结构 【免费下载链接】qri youre invited to a data party! 项目地址: https://gitcode.com/gh_mirrors/qr/qri Qri是一个强大的开源数据协作工具,它提供了丰富的功能来帮助用户管理、共享和验证…...
Performance-Fish:让你的《环世界》后期游戏帧率提升400%的终极优化方案
Performance-Fish:让你的《环世界》后期游戏帧率提升400%的终极优化方案 【免费下载链接】Performance-Fish Performance Mod for RimWorld 项目地址: https://gitcode.com/gh_mirrors/pe/Performance-Fish 你是否曾在《环世界》游戏后期,面对庞大…...
3分钟掌握JetBrains IDE试用期重置:终极完整指南
3分钟掌握JetBrains IDE试用期重置:终极完整指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具(ide-eval-resetter)是一个开源项目,专…...
Noto字体终极指南:告别“豆腐块“,让全球文字清晰显示
Noto字体终极指南:告别"豆腐块",让全球文字清晰显示 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts 在数字世界中,你是否经常看到那些令人困…...
D2DX如何让暗黑破坏神2在4K显示器上流畅运行:5个关键技术解析
D2DX如何让暗黑破坏神2在4K显示器上流畅运行:5个关键技术解析 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 当…...
告别RaiDrive广告!用开源rclone+Alist,免费把阿里云盘/百度网盘变成电脑本地硬盘
开源方案实战:用rcloneAlist打造无广告的云盘本地化体验 每次打开RaiDrive时弹出的广告窗口是否让您感到困扰?商业软件的收费模式是否让您犹豫不决?今天,我们将彻底解决这些问题。通过开源工具Alist和rclone的组合,您不…...
