计算滚动分位数

计算科学 统计数据
2021-12-10 04:30:35

我正在编写的算法需要计算时间序列的滚动分位数。目前我以天真的方式这样做:对于一个大小的窗口和一个大小W向量XN

for t from W to N:
  q[t,:] = quantiles(X[t-W+1:t])

q[t-1]但是,鉴于我知道之前的 quantile 、新数据X[t]X[t-W]刚刚掉出窗口的数据,似乎应该有更快的方法。我正在考虑一些类似于井(?)已知增量平均算法的东西:

for t from W to N:
  m[t] = m[t-1] + ( x[t] - x[t-W] ) / W

这避免了在每个阶段重新计算平均值。即使是近似值也很好。我已经看到了在流上计算分位数的近似值,但对我来说重要的是我有一个滚动窗口,而不仅仅是一个扩展窗口。

1个回答

一种解决方案是使用自平衡二叉树哈希表对数据的滚动窗口进行排序。在每次更新时,您需要支付恒定的插入成本、删除成本和遍历成本来更新五分位数。 O(n)O(n)