matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等

embedded/2025/1/16 6:49:47/
matlab">%% 初始化程序
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);

以下是对上述代码功能的详细解释:

  1. 初始化部分
    • warning off:关闭报警信息,避免一些不必要的警告信息干扰程序的运行。
    • close all:关闭所有打开的图形窗口,确保程序开始时处于一个干净的图形环境。
    • clear:清空工作区中的变量,防止之前的变量影响当前程序的运行。
    • clc:清空命令行窗口,使命令行更加清晰。
    • setdemorandstream(172):设置随机种子为 172,确保程序运行结果的可重复性,使得随机过程在多次运行时产生相同的结果。
  2. 数据读取部分
    • data = xlsread('Y.xlsx'):从名为 Y.xlsx 的 Excel 文件中读取数据。
  3. 数据集划分部分
    • 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 列作为输出测试集,并进行转置。
  4. 归一化处理部分
    • [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 的范围,并存储归一化的结果和归一化参数。
  5. 神经网络结构确定部分
    • 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'):创建一个新的前馈神经网络,激活函数分别为 tansigpurelin,训练算法为 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))))]:显示最佳的隐含层节点数量及其最小的根均方误差。
  6. 模型建立部分
    • 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):使用输入训练集和输出训练集对最终的神经网络进行训练。
  7. 预测和反归一化部分
    • 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):将测试集的归一化预测结果反归一化到原始数据范围。
  8. 误差分析部分
    • 计算训练集的各种误差指标:
      • 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:计算测试集的拟合优度。
  9. 结果作图部分
    • 对训练集的实际值和预测值进行绘图,并显示误差信息。
    • 对测试集的实际值和预测值进行绘图,并显示误差信息。
  10. 参数获取部分
    • 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 神经网络进行数据预测的完整流程,包括数据读取、数据预处理(划分数据集和归一化)、神经网络结构的确定(试凑隐含层节点数量)、训练、预测、结果反归一化、误差分析和结果可视化,并展示了神经网络的部分权重和偏置信息。


http://www.ppmy.cn/embedded/154328.html

相关文章

HAL库 SPI+DMA接收 通讯速率高就读取失败

最近在写一个读取ad7691数据的驱动时,SPI2设置为Receive only master模式,此时发现用SPIDMA的HAL库函数HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)接收数据时(DMA为normal模式,以字节单位传输…

vim使用指南

🏝️专栏:计算机操作系统 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 一、Vim 的基本概念 1.1普通模式 (Normal Mode) 1.2插入模式 (Insert Mode) 1.3命令模…

Vue3使用vue-count-to数字滚动模块报错解决方案

小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下: TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因,排查还得去看源码,所以我们来解决&a…

hot100_240. 搜索二维矩阵 II

hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,1…

【精选】基于EfficientViT优化YOLOv8的智能车辆识别系统设计 车辆颜色分类与车牌检测、深度学习目标检测系统开发

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

(12)springMVC文件的上传

SpringMVC文件上传 首先是快速搭建一个springMVC项目 新建项目mvn依赖导入添加webMoudle添加Tomcat运行环境.在配置tomcat时ApplicationContext置为"/"配置Artfact的lib配置WEB-INF配置文件(记得添加乱码过滤)配置springmvc-servlet文件&…

Vue2+OpenLayers给标点Feature添加信息窗体(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 3.1、信息窗体DOM元素 3.2、创建Overlay 3.3、创建一个点 3.4、给点初始化点击事件 3.5、完整代码 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 初始化变量: d…

【漫话机器学习系列】046.弹性网络(Elastic Net)

弹性网络(Elastic Net) 弹性网络(Elastic Net) 是一种线性回归模型正则化方法,结合了L1正则化(Lasso)和L2正则化(Ridge)的优点,解决了它们各自的缺点&#x…