本文所述的代码示例演示了如何使用长短期记忆网络(LSTM)进行多输入单输出的回归预测。具体功能包括数据生成、预处理、模型构建、训练及性能评估。
代码介绍
主要步骤
-
数据生成与预处理:
- 模拟工业传感器数据,包括多个特征和目标值的非线性组合。
- 对数据进行标准化,以加速模型的收敛速度。
-
构建LSTM回归模型:
- 使用LSTM层提取时序特征,并通过Dropout层防止过拟合。
- 定义全连接层和激活函数,以引入非线性。
-
数据划分与序列生成:
- 采用滑动窗口方法将时序数据转换为监督学习格式。
-
训练参数配置:
- 使用Adam优化器进行训练,设置学习率调整策略及验证数据。
-
模型训练与保存:
- 训练模型并可以选择保存训练好的模型及标准化参数。
-
预测与反标准化:
- 使用训练好的模型进行预测,并将结果反标准化以获得实际值。
-
性能评估:
- 计算均方根误差(RMSE)、平均绝对误差(MAE)和决定系数(R²)来评估模型性能。
-
可视化分析:
- 绘制预测结果与真实值的对比图、误差曲线和误差分布直方图。
相关公式
目标值的非线性组合:
y
=
0.3
⋅
x
1
+
0.5
⋅
tanh
(
x
2
)
−
0.2
⋅
x
3
2
y = 0.3 \cdot x_1 + 0.5 \cdot \tanh(x_2) - 0.2 \cdot x_3^2
y=0.3⋅x1+0.5⋅tanh(x2)−0.2⋅x32
其中
x
1
,
x
2
,
x
3
x_1, x_2, x_3
x1,x2,x3是特征矩阵中的不同特征,目标值 (y) 是通过非线性函数组合得到的。
Z-score标准化:
X
n
o
r
m
=
X
−
μ
σ
X_{norm} = \frac{X - \mu}{\sigma}
Xnorm=σX−μ
其中,
μ
\mu
μ是特征的均值,
σ
\sigma
σ是标准差。标准化过程确保数据均值为0,标准差为1。
LSTM单元的输出(简化版):
h
t
=
o
t
⊙
tanh
(
c
t
)
h_t = o_t \odot \tanh(c_t)
ht=ot⊙tanh(ct)
c
t
=
f
t
⊙
c
t
−
1
+
i
t
⊙
c
~
t
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t
ct=ft⊙ct−1+it⊙c~t
o
t
=
σ
(
W
o
⋅
[
h
t
−
1
,
x
t
]
+
b
o
)
o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)
ot=σ(Wo⋅[ht−1,xt]+bo)
其中:
- h t h_t ht 是当前时刻的隐状态,
- c t c_t ct是单元状态,
- o t o_t ot 是输出门,
- i t i_t it 是输入门,
- f t f_t ft 是遗忘门,
- c ~ t \tilde{c}_t c~t 是候选值。
均方根误差(RMSE):
RMSE
=
1
n
∑
i
=
1
n
(
y
t
r
u
e
,
i
−
y
p
r
e
d
,
i
)
2
\text{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_{true,i} - y_{pred,i})^2}
RMSE=n1i=1∑n(ytrue,i−ypred,i)2
平均绝对误差(MAE):
MAE
=
1
n
∑
i
=
1
n
∣
y
t
r
u
e
,
i
−
y
p
r
e
d
,
i
∣
\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_{true,i} - y_{pred,i}|
MAE=n1i=1∑n∣ytrue,i−ypred,i∣
决定系数(R²):
R
2
=
1
−
∑
i
=
1
n
(
y
t
r
u
e
,
i
−
y
p
r
e
d
,
i
)
2
∑
i
=
1
n
(
y
t
r
u
e
,
i
−
y
ˉ
t
r
u
e
)
2
R^2 = 1 - \frac{\sum_{i=1}^{n} (y_{true,i} - y_{pred,i})^2}{\sum_{i=1}^{n} (y_{true,i} - \bar{y}_{true})^2}
R2=1−∑i=1n(ytrue,i−yˉtrue)2∑i=1n(ytrue,i−ypred,i)2
其中,
y
ˉ
t
r
u
e
\bar{y}_{true}
yˉtrue是真实值的均值。
运行结果
真值与预测值对比曲线:
误差曲线:
误差分布直方图:
训练收敛曲线:
MATLAB源代码
部分代码:
%% 【LSTM多输入单输出】基于长短期记忆网络的多输入单输出回归预测的例程
% 2025-06-15/Ver3
clc; clear; close all;
rng(0); % 固定随机种子确保实验可重复性
%% 数据生成与预处理(模拟工业传感器数据)
numSteps = 1000; % 总数据点数(建议≥1000以保证时序特征学习)
numFeatures = 10; % 特征维度(对应工业传感器数量)
% 生成基准信号(包含非线性趋势)
time = linspace(0, 20*pi, numSteps)'; % 时间序列(带周期性变化)
baseSignal = 0.5*sin(0.5*time) + 0.3*cos(2.5*time); % 复合周期信号
% 构建多变量特征矩阵(模拟多传感器读数)
features = zeros(numSteps, numFeatures);
for i = 1:numFeatures
noise = 0.1*randn(numSteps,1); % 添加高斯噪声模拟传感器误差
features(:,i) = baseSignal.*(0.8+0.1*i) + 0.2*sin(i*time) + noise; % 生成非线性相关特征
end
完整代码:https://download.csdn.net/download/callmeup/91023042
或: