区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测

目录

  • 区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测
  • 效果一览
  • 基本介绍
  • 模型描述
  • 程序设计
  • 参考资料

效果一览



区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_QRLSTM

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_长短期记忆神经网络_02

基本介绍

MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测
QRLSTM是一种基于长短期记忆(LSTM)神经网络的模型,用于时间序列区间预测。它是使用分位数回归来进行预测的,这意味着它可以预测一系列可能的结果,而不仅仅是单个点预测。
具体来说,QRLSTM使用LSTM网络来学习时间序列的长期和短期依赖关系,然后使用分位数回归来预测一系列可能的结果。分位数回归是一种非常有用的技术,它可以预测出给定置信水平下的上限和下限,这对于时间序列预测非常有用。
QRLSTM模型的预测能力很强,特别是在处理非线性时间序列时。它已经被广泛应用于股票市场、气象预测、交通预测等领域。

模型描述

QRLSTM模型的数学公式如下:
首先,我们定义LSTM网络中的隐藏状态和细胞状态:

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_分位数回归_03

  • 其中,区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_时间序列_04是时间步区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_时间序列_05的输入,区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_长短期记忆神经网络_06区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_QRLSTM_07分别是上一时间步的隐藏状态和细胞状态。

然后,我们定义分位数回归的损失函数:

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_QRLSTM_08

  • 其中,区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_分位数回归_09是分位数水平,区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_长短期记忆神经网络_10是时间序列在时间步区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_分位数回归_11的真实值,区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_长短期记忆神经网络_12是模型在时间步区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_分位数回归_11的预测值,区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_时间序列区间预测_14是分位数损失函数:

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_长短期记忆神经网络_15

最终我们的目标是最小化所有分位数水平下的损失函数:

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_分位数回归_16

  • 其中,区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测_时间序列_17是一组分位数水平。

QRLSTM模型使用随机梯度下降或者其他优化算法最小化上述损失函数,从而得到最优的模型参数。

程序设计

  • 完整程序和数据获取方式(资源出下载):MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测
% 构建模型
numFeatures = size(XTrain,1); % 输入特征数
numHiddenUnits = 200; % 隐藏单元数
numQuantiles = 1; % 分位数数目
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    dropoutLayer(0.2)
    fullyConnectedLayer(numQuantiles)
    regressionLayer];
options = trainingOptions('adam', ...
    'MaxEpochs',50, ...
    'MiniBatchSize',64, ...
    'GradientThreshold',1, ...
    'Shuffle','every-epoch', ...
    'Verbose',false);
net = trainNetwork(XTrain,YTrain,layers,options); % 训练模型

% 测试模型
YPred = predict(net,XTest); % 预测输出
quantiles = [0.1,0.5,0.9]; % 分位数
for i = 1:length(quantiles)
    q = quantiles(i);
    epsilon = YTest - YPred(:,i); % 预测误差
    lag = 10; % 滞后期数
    sigma = median(abs(epsilon(max(1,end-lag+1):end))) * 1.483; % 置信区间
    lb = YPred(:,i) - sigma * norminv(1-q/2,0,1); % 置信区间下限
    ub = YPred(:,i) + sigma * norminv(1-q/2,0,1); % 置信区间上限
    disp(['Quantile:',num2str(q),' MAE:',num2str(mean(abs(epsilon))),' Width:',num2str(mean(ub-lb))]);
end