区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测
目录
- 区间预测 | MATLAB实现QRCNN-LSTM卷积长短期记忆神经网络分位数回归时间序列区间预测
- 效果一览
- 基本介绍
- 模型描述
- 程序设计
- 参考资料
效果一览
基本介绍
1.Matlab实现基于QRCNN-LSTM分位数回归卷积长短期记忆神经网络的时间序列区间预测模型;
2.多图输出、多指标输出(MAE、RMSE、MSE、R2),多输入单输出,含不同置信区间图、概率密度图;
3.data为数据集,功率数据集,用过去一段时间的变量,预测目标,目标为最后一列,也可适用于负荷预测、风速预测;MainQRCNN_LSTMTS为主程序,其余为函数文件,无需运行;
4.代码质量高,注释清楚,含数据预处理部分,处理缺失值,如果为nan,用上一行替代,也含核密度估计;
模型描述
QRCNN-LSTM是一种结合了卷积神经网络(CNN)和长短期记忆神经网络(LSTM)的深度学习模型,用于时间序列预测。它的核心思想是将CNN用于提取时间序列的局部特征,然后将这些特征输入到LSTM中进行整体建模。在此基础上,QRCNN-LSTM模型还引入了分位数回归(Quantile Regression)的概念,可以用于预测时间序列的不同分位数区间范围内的值,从而提高了模型的预测能力。
具体来说,QRCNN-LSTM模型将时间序列划分为不同的区间,每个区间内包含若干个连续的时间步长。对于每个区间,模型使用CNN提取局部特征,然后将这些特征输入到LSTM中进行整体建模,得到该区间内的预测结果。而为了预测不同分位数区间的值,模型在LSTM的输出层引入了多个输出节点,每个节点对应一个分位数,从而可以同时预测不同分位数的值。
总的来说,QRCNN-LSTM模型在时间序列预测中具有较强的能力,可以应用于多个领域,如金融、气象、能源等。
-
QRCNN-LSTM模型的具体公式如下:
-
首先,对于输入的时间序列数据 x t x_t xt,我们可以通过CNN提取出局部特征 v t ( i ) v_t^{(i)} vt(i):
v t ( i ) = f ( W ( i ) ∗ x t : t + h − 1 + b ( i ) ) v_t^{(i)} = f(W^{(i)} * x_{t:t+h-1} + b^{(i)}) vt(i)=f(W(i)∗xt:t+h−1+b(i))
-
其中, W ( i ) W^{(i)} W(i) 和 b ( i ) b^{(i)} b(i) 分别表示CNN中的卷积核和偏置项, h h h 表示卷积核的大小, f f f 表示激活函数, ∗ * ∗ 表示卷积操作, x t : t + h − 1 x_{t:t+h-1} xt:t+h−1 表示从 t t t 到 t + h − 1 t+h-1 t+h−1 的时间步数据。这里 v t ( i ) v_t^{(i)} vt(i) 表示第 i i i 个卷积核提取出的局部特征。
-
接下来,我们将所有的局部特征 v t ( 1 ) , v t ( 2 ) , . . . , v t ( n ) v_t^{(1)}, v_t^{(2)}, ..., v_t^{(n)} vt(1),vt(2),...,vt(n) 拼接起来,并通过一个全连接层将其映射到一个低维的隐层状态 h t h_t ht:
h t = g ( W h [ v t ( 1 ) ; v t ( 2 ) ; . . . ; v t ( n ) ] + b h ) h_t = g(W_h[v_t^{(1)};v_t^{(2)};...;v_t^{(n)}] + b_h) ht=g(Wh[vt(1);vt(2);...;vt(n)]+bh)
-
其中, W h W_h Wh 和 b h b_h bh 分别表示全连接层的权重和偏置项, [ v t ( 1 ) ; v t ( 2 ) ; . . . ; v t ( n ) ] [v_t^{(1)};v_t^{(2)};...;v_t^{(n)}] [vt(1);vt(2);...;vt(n)] 表示将所有局部特征拼接起来, g g g 表示激活函数。这里 h t h_t ht 表示时间步 t t t 的隐层状态。
-
最后,我们使用LSTM对隐层状态 h t h_t ht 进行建模,并在输出层引入多个输出节点进行分位数回归,得到不同分位数区间的预测结果。具体地,LSTM的计算公式为:
i t = σ ( W i i x t + b i i + W h i h t − 1 + b h i ) f t = σ ( W i f x t + b i f + W h f h t − 1 + b h f ) o t = σ ( W i o x t + b i o + W h o h t − 1 + b h o ) c t = f t ⊙ c t − 1 + i t ⊙ tanh ( W i c x t + b i c + W h c h t − 1 + b h c ) h t = o t ⊙ tanh ( c t ) \begin{aligned} i_t &= \sigma(W_{ii} x_t + b_{ii} + W_{hi} h_{t-1} + b_{hi}) \ f_t &= \sigma(W_{if} x_t + b_{if} + W_{hf} h_{t-1} + b_{hf}) \ o_t &= \sigma(W_{io} x_t + b_{io} + W_{ho} h_{t-1} + b_{ho}) \ c_t &= f_t \odot c_{t-1} + i_t \odot \tanh(W_{ic} x_t + b_{ic} + W_{hc} h_{t-1} + b_{hc}) \ h_t &= o_t \odot \tanh(c_t) \end{aligned} it=σ(Wiixt+bii+Whiht−1+bhi) ft=σ(Wifxt+bif+Whfht−1+bhf) ot=σ(Wioxt+bio+Whoht−1+bho) ct=ft⊙ct−1+it⊙tanh(Wicxt+bic+Whcht−1+bhc) ht=ot⊙tanh(ct)
- 其中, i t , f t , o t i_t, f_t, o_t it,ft,ot 分别表示输入门、遗忘门和输出门的激活值, σ \sigma σ 表示sigmoid函数, ⊙ \odot ⊙ 表示逐元素乘积, c t c_t ct 表示细胞状态, tanh \tanh tanh 表示双曲正切函数。在输出层,我们引入 K K K 个输出节点,每个节点对应一个分位数,假设第 k k k 个节点的输出为 y k , t y_{k,t} yk,t,则其计算公式为:
y k , t = W o u t , k h t + b o u t , k y_{k,t} = W_{out,k} h_t + b_{out,k} yk,t=Wout,kht+bout,k
- 其中, W o u t , k W_{out,k} Wout,k 和 b o u t , k b_{out,k} bout,k 分别表示第 k k k 个节点的权重和偏置项。在训练时,我们使用分位数损失函数对模型进行优化:
L τ = { τ ( y t − y ^ τ , t ) if y t − y ^ τ , t ≥ 0 ( τ − 1 ) ( y t − y ^ τ , t ) otherwise L_{\tau} = \begin{cases} \tau(y_t - \hat{y}{\tau,t}) & \text{if } y_t - \hat{y}{\tau,t} \geq 0 \ (\tau - 1)(y_t - \hat{y}_{\tau,t}) & \text{otherwise} \end{cases} Lτ={τ(yt−y^τ,t)if yt−y^τ,t≥0 (τ−1)(yt−y^τ,t)otherwise
- 其中, τ \tau τ 表示分位数, y t y_t yt 表示真实值, y ^ τ , t \hat{y}_{\tau,t} y^τ,t 表示模型预测的 τ \tau τ 分位数值。
QRCNN-LSTM模型的原理是将CNN和LSTM这两种不同类型的神经网络结合起来,利用CNN提取时间序列的局部特征,再用LSTM对整体进行建模,从而能够更好地捕捉时间序列中的长期依赖关系和局部特征。同时,模型还引入了分位数回归的概念,可以预测时间序列在不同分位数区间的值,提高了模型的预测能力。
程序设计
- 完整程序和数据获取方式:私信博主。
%-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 加载数据
load data.mat
%-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 模型参数
numFilters = 128; % 滤波器数量
filterSize = 5; % 滤波器大小
numHiddenUnits = 256; % LSTM隐单元数量
dropoutRate = 0.2; % dropout率
numQuantiles = 3; % 分位数数量
learningRate = 0.001; % 学习率
numEpochs = 50; % 训练轮数
%-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 构建QRCNN-LSTM模型
inputLayer = sequenceInputLayer(inputSize);
convLayer = convolution1dLayer(filterSize,numFilters,'Padding','same');
lstmLayer = lstmLayer(numHiddenUnits,'OutputMode','last');
dropoutLayer = dropoutLayer(dropoutRate);
fcLayer = fullyConnectedLayer(numQuantiles);
outputLayer = regressionLayer();
%-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
layers = [inputLayer
convLayer
lstmLayer
dropoutLayer
fcLayer
outputLayer];
%-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 设置训练选项
options = trainingOptions('adam', ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropFactor',0.1, ...
'LearnRateDropPeriod',5, ...
'MaxEpochs',numEpochs, ...
'MiniBatchSize',32, ...
'GradientThreshold',1, ...
'Shuffle','every-epoch', ...
'Verbose',1, ...
'Plots','training-progress');
%-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 训练模型
net = trainNetwork(XTrain,YTrain,layers,options);
% 预测
YPred = predict(net,XTest);
%-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 展示结果
figure
plot(YTest)
hold on
plot(YPred)
legend('True','Predicted')
xlabel('Time')
ylabel('Data')
参考资料
[1] https://blog.csdn.net/kjm13182345320/article/details/127931217
[2] https://blog.csdn.net/kjm13182345320/article/details/127418340