Matlab凭借内置的深度神经网络工具箱,无需手动搭建反向传播底层逻辑,就能快速实现各类神经网络预测任务。以下分别提供**通用回归场景的BP神经网络预测代码**、**时间序列场景的LSTM预测代码**,均带详细注释可直接运行。
—
### 一、BP神经网络回归预测代码(适用多输入单/多输出回归预测)
适用场景:已知N组样本的K个输入特征,对应1个/多个输出标签,可用于房价预测、故障预警、污染物浓度预测等回归任务。
“`matlab
%% 1. 加载与划分数据集
clear;clc;close all
% 这里以Matlab自带的波士顿房价数据集为例,输入13个特征,输出1个房价标签
load house_dataset
% 输入特征维度为(特征数,样本数),输出标签维度为(标签数,样本数)
inputs = houseInputs;
outputs = houseTargets;
% 随机划分训练集80%,测试集20%
n = size(inputs,2);
train_ratio = 0.8;
train_idx = randperm(n,round(train_ratio*n));
test_idx = setdiff(1:n,train_idx);
train_input = inputs(:,train_idx);
train_output = outputs(:,train_idx);
test_input = inputs(:,test_idx);
test_output = outputs(:,test_idx);
%% 2. 数据归一化(将输入输出映射到[-1,1]区间,提升训练稳定性)
[input_norm, input_ps] = mapminmax(train_input, -1, 1);
[output_norm, output_ps] = mapminmax(train_output, -1, 1);
% 测试集用训练集的归一化参数做映射,避免数据泄露
test_input_norm = mapminmax(‘apply’, test_input, input_ps);
%% 3. 构建并训练BP神经网络
hidden_num = 10; % 隐含层神经元数量,可根据效果调整
net = feedforwardnet(hidden_num); % 创建前馈BP神经网络
% 可自定义训练函数:trainlm(L-M算法收敛快)、traingdx(梯度下降)、trainbr(贝叶斯正则化防过拟合)
net.trainFcn = ‘trainlm’;
% 设置训练参数:最大迭代次数、目标误差、学习率
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-5;
net.trainParam.lr = 0.01;
% 训练网络
net = train(net, input_norm, output_norm);
%% 4. 预测与反归一化
predict_norm = net(test_input_norm);
predict_output = mapminmax(‘reverse’, predict_norm, output_ps); % 反归一化得到真实预测值
%% 5. 效果评估与可视化
% 计算评价指标:均方误差MSE、决定系数R2
mse = mean((predict_output – test_output).^2);
r2 = 1 – sum((predict_output – test_output).^2)/sum((test_output – mean(test_output)).^2);
disp([‘测试集均方误差MSE:’,num2str(mse)]);
disp([‘测试集决定系数R2:’,num2str(r2)]);
% 绘制预测值与真实值对比图
figure
plot(test_output,’b-o’,’LineWidth’,1.5)
hold on
plot(predict_output,’r-*’,’LineWidth’,1.5)
legend(‘真实值’,’预测值’)
xlabel(‘测试样本编号’)
ylabel(‘预测指标值’)
title([‘BP神经网络预测效果 R2=’,num2str(r2)])
grid on
“`
—
### 二、LSTM时间序列预测代码(适用单变量/多变量时间序列预测)
适用场景:针对具有时序依赖的数据,比如电力负荷预测、流量预测、股价预测等,LSTM能捕捉长周期时序规律。
“`matlab
%% 1. 加载时间序列数据,这里以Matlab自带的气温时间序列为例
clear;clc;close all
load climate_dataset
% 取单变量气温数据,维度为(1,样本数)
ts = climateTargets(1,:);
seq_len = 24; % 时间窗长度:用前24个时刻的数值预测下1个时刻的数值
n = length(ts);
%% 2. 构造时间序列样本
input_seq = [];
output_seq = [];
for i = seq_len+1:n
input_seq = cat(3,input_seq,ts(i-seq_len:i-1)); % LSTM输入维度为(特征数, 时间窗, 样本数)
output_seq = [output_seq,ts(i)];
end
%% 3. 划分训练集测试集,归一化
train_ratio = 0.8;
train_num = round(size(input_seq,3)*train_ratio);
train_input = input_seq(:,:,1:train_num);
train_output = output_seq(:,1:train_num);
test_input = input_seq(:,:,train_num+1:end);
test_output = output_seq(:,train_num+1:end);
% 归一化
[input_norm, input_ps] = mapminmax(train_input, -1, 1);
[output_norm, output_ps] = mapminmax(train_output, -1, 1);
test_input_norm = mapminmax(‘apply’, test_input, input_ps);
%% 4. 构建LSTM网络
input_size = 1; % 输入特征数,单变量预测为1,多变量对应特征数
hidden_size = 32; % LSTM隐含层单元数
output_size = 1; % 输出维度
layers = [
sequenceInputLayer(input_size) % 序列输入层
lstmLayer(hidden_size) % LSTM层
dropoutLayer(0.2) % dropout层防止过拟合
fullyConnectedLayer(output_size) % 全连接输出层
regressionLayer]; % 回归层
% 设置训练选项
options = trainingOptions(‘adam’, …
‘MaxEpochs’,200, …
‘GradientThreshold’,1, …
‘InitialLearnRate’,0.005, …
‘LearnRateSchedule’,’piecewise’, …
‘LearnRateDropPeriod’,50, …
‘LearnRateDropFactor’,0.2, …
‘Verbose’,0, …
‘Plots’,’training-progress’);
%% 5. 训练与预测
net = trainNetwork(input_norm,output_norm,layers,options);
predict_norm = predict(net,test_input_norm);
predict_output = mapminmax(‘reverse’,predict_norm,output_ps);
%% 6. 效果评估
mse = mean((predict_output – test_output).^2);
r2 = 1 – sum((predict_output – test_output).^2)/sum((test_output – mean(test_output)).^2);
disp([‘LSTM测试集均方误差MSE:’,num2str(mse)]);
disp([‘LSTM测试集决定系数R2:’,num2str(r2)]);
% 绘图
figure
plot(test_output,’b-‘,’LineWidth’,1.5)
hold on
plot(predict_output,’r-‘,’LineWidth’,1.5)
legend(‘真实值’,’预测值’)
xlabel(‘时间步’)
ylabel(‘气温’)
title([‘LSTM时间序列预测效果 R2=’,num2str(r2)])
grid on
“`
—
### 三、代码使用注意事项
1. **数据格式适配**:替换自有数据集时,需保证输入矩阵维度符合要求:BP网络输入为`(特征数, 样本数)`,LSTM输入为`(特征数, 时间窗长度, 样本数)`。
2. **参数调优**:预测效果不佳时可优先调整隐含层神经元数量、学习率、迭代次数;时序场景可调整时间窗长度、增加LSTM层数。
3. **过拟合处理**:若训练集误差远小于测试集误差,可加入Dropout层、减少网络层数、扩充训练数据集。
4. **拓展性**:若需要实现CNN、GRU、Transformer等预测模型,只需修改`layers`中的网络结构即可,训练和预测逻辑与上述代码一致。
本文由AI大模型(Doubao-Seed-1.6)结合行业知识与创新视角深度思考后创作。