我一直在处理以下问题。我有一个实时系统,每个时间框架我都会读取它的当前值,创建一个时间序列(例如 1、12、2、3、5、9、1,...)。我想知道以在线方式预测下一个值的方法(统计和机器学习)(意味着每次读取新值时)。我尝试了 R 的 ARIMA 和 Weka 的 SMOreg,它们的预测结果很好,但是它们有点慢,因为每次出现新值时我都必须重新计算。
PS 如果该方法有一个置信区间,那就太好了。
我一直在处理以下问题。我有一个实时系统,每个时间框架我都会读取它的当前值,创建一个时间序列(例如 1、12、2、3、5、9、1,...)。我想知道以在线方式预测下一个值的方法(统计和机器学习)(意味着每次读取新值时)。我尝试了 R 的 ARIMA 和 Weka 的 SMOreg,它们的预测结果很好,但是它们有点慢,因为每次出现新值时我都必须重新计算。
PS 如果该方法有一个置信区间,那就太好了。
首先,您需要对数据进行时间嵌入。例如,将 [1, 12, 2, 3] 和相应的输出 [5] 作为第一个输入,将 [12, 2, 3, 5] 和相应的输出 [9] 作为第二个输入。(这是延迟 4 的嵌入,但您可以选择另一个更适合的值。)
现在你有一个有效的预测问题。对于这些数据,您可以应用在线高斯过程。这是一种机器学习方法,可以完全按照您的描述进行,并提供置信区间。
如果您的模型是非平稳的,您可以尝试使用非平稳扩展内核递归最小二乘跟踪器。顺便说一句,那篇论文包括用于固定和非固定情况的 Matlab 代码。
这些方法相当快:它们的计算复杂度与您存储在内存中的数据数量成二次方(这通常是所有已处理数据的一小部分,具有代表性)。对于更快的方法,我推荐例如内核最小均方法,但它们的准确性较低。
在您的实时系统中,观察时间是不均匀的并且数据是非平稳的吗?如果你想要简单快速的东西,我建议使用非同质 EMA 类型运算符:
他们根据每个新观察值更新 EMA (
与平滑/调整参数。这是一种估计期望值的简单方法。
也可以通过更新创建一个简单的在线中位数估计
在实践中,您希望小(或随着更多观察而衰减)。理想情况下应该取决于更新的不平衡程度;即如果实际上等于中位数,则应该在上是统一的。然后,您可以将其扩展到深度平衡二叉树类型结构,以获得均匀分布
上述组合应该可以为您提供体面的在线数据分布。这棵树很难做对,如果你有兴趣,我在 C++ 中都有实现。我在实践中经常使用这两种方法(财务实时报价数据)并且它们运行良好。
卡尔曼滤波器是一种递归算法。它采用新的观察并将其与先前的预测相结合。使用它会很好,但前提是它是适合您的数据的模型。我不确定更新预测间隔有多容易。
我不知道您是否尝试过,但是在 R 中,当您使用 Arima 函数时,您可以将模型指定为输入。因此,如果最初您找到了一个带有相应平滑组件的 arima(1,2,1) 模型,那么您可以在以后的迭代中修复该模型,这样它就不会尝试重新拟合模型。如果您的数据在这种情况下是固定的,那么预测可能对您来说已经足够好——而且速度要快得多。
希望这可以帮助..