如何处理在线时间序列预测?

机器算法验证 时间序列 机器学习 在线算法 预测
2022-03-25 15:23:32

我一直在处理以下问题。我有一个实时系统,每个时间框架我都会读取它的当前值,创建一个时间序列(例如 1、12、2、3、5、9、1,...)。我想知道以在线方式预测下一个值的方法(统计和机器学习)(意味着每次读取新值时)。我尝试了 R 的 ARIMA 和 Weka 的 SMOreg,它们的预测结果很好,但是它们有点慢,因为每次出现新值时我都必须重新计算。

PS 如果该方法有一个置信区间,那就太好了。

4个回答

首先,您需要对数据进行时间嵌入。例如,将 [1, 12, 2, 3] 和相应的输出 [5] 作为第一个输入,将 [12, 2, 3, 5] 和相应的输出 [9] 作为第二个输入。(这是延迟 4 的嵌入,但您可以选择另一个更适合的值。)

现在你有一个有效的预测问题。对于这些数据,您可以应用在线高斯过程这是一种机器学习方法,可以完全按照您的描述进行,并提供置信区间。

如果您的模型是非平稳的,您可以尝试使用非平稳扩展内核递归最小二乘跟踪器顺便说一句,那篇论文包括用于固定和非固定情况的 Matlab 代码。

这些方法相当快:它们的计算复杂度与您存储在内存中的数据数量成二次方(这通常是所有已处理数据的一小部分,具有代表性)。对于更快的方法,我推荐例如内核最小均方法,但它们的准确性较低。

在您的实时系统中,观察时间是不均匀的并且数据是非平稳的吗?如果你想要简单快速的东西,我建议使用非同质 EMA 类型运算符:

非齐次时间序列上的算子

他们根据每个新观察值更新 EMA (value

value+=α(newDatavalue),α=1exp(Δtτ)

平滑/调整参数。这是一种估计期望值的简单方法。τ

也可以通过更新创建一个简单的在线中位数估计

sg=sgn(newDatamed)med+=ϵ(sgmed)

在实践中,您希望小(或随着更多观察而衰减)。理想情况下应该取决于更新的不平衡程度;即如果实际上等于中位数,则应该在上是统一的。然后,您可以将其扩展到深度平衡二叉树类型结构,以获得均匀分布ϵϵmedsg{1,1}d2d+11

上述组合应该可以为您提供体面的在线数据分布。这棵树很难做对,如果你有兴趣,我在 C++ 中都有实现。我在实践中经常使用这两种方法(财务实时报价数据)并且它们运行良好。

卡尔曼滤波器是一种递归算法。它采用新的观察并将其与先前的预测相结合。使用它会很好,但前提是它是适合您的数据的模型。我不确定更新预测间隔有多容易。

我不知道您是否尝试过,但是在 R 中,当您使用 Arima 函数时,您可以将模型指定为输入。因此,如果最初您找到了一个带有相应平滑组件的 arima(1,2,1) 模型,那么您可以在以后的迭代中修复该模型,这样它就不会尝试重新拟合模型。如果您的数据在这种情况下是固定的,那么预测可能对您来说已经足够好——而且速度要快得多。

希望这可以帮助..