区间预测 | MATLAB实现QGPR高斯过程分位数回归多变量时间序列区间预测
目录
- 区间预测 | MATLAB实现QGPR高斯过程分位数回归多变量时间序列区间预测
- 效果一览
- 基本介绍
- 模型描述
- 程序设计
- 参考资料
效果一览
基本介绍
MATLAB实现QGPR高斯过程分位数回归多变量时间序列区间预测
1.基于高斯过程回归(QGPR)分位数多变量时间序列区间预测,Matlab代码,多变量输入单变量输出时间序列预测模型。
2.评价指标包括:R2、MAE、MSE、RMsE和区间覆盖率和区间平均宽度百分比等,代码质量极高,方便学习和替换数据。
高斯过程分位数回归是一种基于高斯过程的统计学习方法,用于对时间序列进行预测。在时间序列区间预测中,GPR可以用于预测一系列未来时间点的分位数,从而提供关于未来趋势的一些信息。
具体来说,GPR可以用于估计某个时间点的观测值在给定分位数水平下的概率分布。这个分布可以用来计算区间预测。GPR 的预测结果可以提供一些关于未来时间序列的不确定性信息,这对于决策者和风险管理者来说非常有用。
在应用 GPR进行时间序列区间预测时,需要首先选择合适的高斯过程模型,然后基于历史数据进行参数估计和模型训练。一旦模型训练完成,就可以用它来对时间序列进行预测和区间估计。
需要注意的是,GPR是一种复杂的统计学习方法,需要一定的数学和计算机技能才能进行有效的应用。此外,预测结果也受到历史数据的限制,因此在进行时间序列区间预测时需要谨慎选择样本数据,并且需要不断更新模型以反映新的数据和趋势。
模型描述
-
QGPR 的原理和基本思想与传统的高斯过程回归(GPR)类似,但是在预测分位数时,QGPR引入了一个分位数损失函数,来惩罚预测结果与真实观测值之间的偏差。QGPR 的预测结果是一个概率分布,可以用来计算区间预测。
-
下面是 QGPR的主要公式:
-
假设我们有一个时间序列数据集 ( X , y ) (\mathbf{X}, \mathbf{y}) (X,y),其中 X \mathbf{X} X 是 n × d n \times d n×d 的矩阵,表示 n n n 个时间点的 d d d 个特征值, y \mathbf{y} y 是 n × 1 n \times 1 n×1 的向量,表示相应的观测值。我们的目标是预测未来时间点 t ∗ t^* t∗ 的观测值在给定分位数水平 τ \tau τ 下的概率分布。
-
QGPR 的预测结果是一个高斯分布,其均值和方差分别由以下公式给出:
y ^ t ∗ , τ = k T ( K + σ 2 I ) − 1 y \hat{y}_{t^*, \tau} = \mathbf{k}^T (\mathbf{K} + \sigma^2 \mathbf{I})^{-1} \mathbf{y} y^t∗,τ=kT(K+σ2I)−1y
σ ^ t ∗ , τ 2 = k t ∗ t ∗ − k T ( K + σ 2 I ) − 1 k \hat{\sigma}^2_{t^*, \tau} = k_{t^* t^*} - \mathbf{k}^T (\mathbf{K} + \sigma^2 \mathbf{I})^{-1} \mathbf{k} σ^t∗,τ2=kt∗t∗−kT(K+σ2I)−1k
- 其中, k \mathbf{k} k 是 t ∗ t^* t∗ 与历史时间点的核函数向量, K \mathbf{K} K 是历史时间点之间的核函数矩阵, σ 2 \sigma^2 σ2 是噪声方差, I \mathbf{I} I 是单位矩阵。在 GPR-Q 中,核函数的选择通常使用径向基函数(RBF)核函数,其形式为:
k ( x i , x j ) = σ f 2 exp ( − 1 2 l 2 ∣ ∣ x i − x j ∣ ∣ 2 ) k(x_i, x_j) = \sigma_f^2 \exp\left(-\frac{1}{2l^2}||x_i - x_j||^2\right) k(xi,xj)=σf2exp(−2l21∣∣xi−xj∣∣2)
-
其中, σ f 2 \sigma_f^2 σf2 是核函数的方差, l l l 是核函数的长度尺度。
-
QGPR引入了一个分位数损失函数,来惩罚预测结果与真实观测值之间的偏差。假设 y t ∗ y_{t^*} yt∗ 是真实观测值, F τ ( y t ∗ ) F_{\tau}(y_{t^*}) Fτ(yt∗) 是给定分位数水平 τ \tau τ 下的累积分布函数, q τ ( y t ∗ ) q_{\tau}(y_{t^*}) qτ(yt∗) 是给定分位数水平 τ \tau τ 下的分位数点,分位数损失函数可以表示为:
L τ ( y t ∗ , y ^ t ∗ , τ ) = { τ ∣ y t ∗ − y ^ t ∗ , τ ∣ y t ∗ < q τ ( y ^ t ∗ , τ ) ( 1 − τ ) ∣ y t ∗ − y ^ t ∗ , τ ∣ y t ∗ ≥ q τ ( y ^ t ∗ , τ ) L_{\tau}(y_{t^*}, \hat{y}_{t^*, \tau}) = \begin{cases} \tau |y_{t^*} - \hat{y}_{t^*, \tau}| & y_{t^*} < q_{\tau}(\hat{y}_{t^*, \tau}) \\ (1-\tau) |y_{t^*} - \hat{y}_{t^*, \tau}| & y_{t^*} \geq q_{\tau}(\hat{y}_{t^*, \tau}) \end{cases} Lτ(yt∗,y^t∗,τ)={τ∣yt∗−y^t∗,τ∣(1−τ)∣yt∗−y^t∗,τ∣yt∗<qτ(y^t∗,τ)yt∗≥qτ(y^t∗,τ)
- 其中 q τ ( y ^ t ∗ , τ ) q_{\tau}(\hat{y}_{t^*, \tau}) qτ(y^t∗,τ) 表示在给定分位数水平 τ \tau τ 下,均值预测值的分位数点。QGPR 的目标是最小化预测结果的分位数损失函数,从而得到最优的预测结果。
程序设计
- 完整程序和数据获取方式:私信博主,或同等价值程序兑换;
%% 数据集分析
outdim = 1; % 最后一列为输出
num_size = 0.7; % 训练集占数据集比例
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%% 转置以适应模型
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';
%% 模型创建
alpha = 0.10;
net = fitrgp(p_train, t_train);
%% 仿真测试
%% 数据反归一化
L_sim1 = mapminmax('reverse', l_sim1, ps_output);
L_sim2 = mapminmax('reverse', l_sim2, ps_output);
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
参考资料
[1] https://blog.csdn.net/kjm13182345320/article/details/127931217
[2] https://blog.csdn.net/kjm13182345320/article/details/127418340