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

news/2025/1/15 22:54:14 标签: matlab, 神经网络, 深度学习
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 = bound
    net=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.niftyadmin.cn/n/5824427.html

相关文章

shell脚本练习(5)

一、需求:判断192.168.121.0/24网络中,当前在线的ip有哪些,并编写脚本打印出来。 [rootopenEuler-1 script]# cat exist_IP.sh #!/bin/bash ######################### #File name:exist_IP.sh #Email:obboda163.com #Created time:2025-01-…

如何制作一个高质量的 Dockerfile 镜像:从入门到实践

Docker 是一种轻量级的容器化技术,能够将应用程序及其依赖打包到一个可移植的容器中。Dockerfile 是构建 Docker 镜像的核心文件,它定义了镜像的构建步骤和配置。通过编写 Dockerfile,我们可以自动化地构建镜像,确保应用程序在不同…

Linux ssh连接算法配置

在Linux系统中,SSH连接的算法配置主要涉及密钥交换算法、加密算法和消息认证码算法。以下是如何查看和配置这些算法的具体步骤: 查看SSH服务器支持的算法 查看当前配置: 可以通过查看sshd_config文件来了解SSH服务器支持的算法。使用以下命令…

GESP2024年12月认证C++六级( 第三部分编程题(1)树上游走)

参考程序&#xff1a; #include <iostream> #include <string>using namespace std;int main() {long long n, s; // n为移动次数&#xff0c;s为初始节点编号string moves; // 移动指令串// 输入处理cin >> n >> s;cin >> moves;long long…

【Golang 面试题】每日 3 题(三十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

刀客doc:快手的商业化架构为什么又调了?

一、 1月10日&#xff0c;快手商业化及电商事业部进行新一轮的架构调整。作为2025年快手的第一次大调整&#xff0c;变动最大的是负责广告业务的商业化事业部。快手商业化将原来的8个业务中心&#xff0c;现在统合成了5个&#xff0c;行业归拢看上去更加明晰了。 根据自媒体《…

Android车机DIY开发之软件篇(九)默认应用和服务修改

Android车机DIY开发之软件篇(九)默认应用和服务修改 Car默认应用位置 ~/packages/apps/Car 增加APP 1.增加 XXXX.app 和Android.mk 2. 修改~/build/make/target/product/handheld_system_ext.mk Android默认APK位置 ~/packages/apps 1.增加文件夹 app和mk文件 2.build/mak…

VUE3 + Ant Design Vue4 开发笔记

异常记录 [Vue warn]: Extraneous non-props attributes (options) were passed to component but could not be automatically inherited because component renders fragment or text root nodes 定位原因解决方法 错误的中文释义&#xff1a;[Vue 警告]&#xff1a;传递给…