【问题标题】:Time windowed online variance algorithm时间窗在线方差算法
【发布时间】:2014-11-16 12:41:52
【问题描述】:

我正在尝试找到一种有效的在线算法来计算预定义 时间 窗口(例如最后 5 分钟)中的滚动方差。它需要高效,因为我无法在时间窗口内保留所有数据点,因为它们以每秒 10M 数据点的频率到达。理想情况下,算法也应该是数值稳定的。我知道Welford's algorithm 表示非窗口滚动方差。

我知道 fixed-size 窗口的其他 SO 答案。我相信这是一个不同的问题。

【问题讨论】:

  • 不清楚你所说的窗口滚动方差。真的有必要考虑所有样本吗?
  • 如果所需精度允许,您可以重新调整值并将它们转换为整数。然后可以使用 64 位累加器精确且可逆地累加 [squared] 值。如果这还不够,请累积 128 位。
  • 如果你的时间窗口总是,比如说,一个整数秒,那么你可以计算和存储每秒数据的计数、平均值、方差,并将它们结合起来得到计数,平均值,窗口的方差。
  • @dmuir 我认为您的建议很有道理。通过在第二级进行量化,我们回到了标准固定窗口问题(我们知道如何解决),假设使用每秒计算例如每分钟的平均值在统计上是正确的吗?
  • @dmuir 您如何使用例如的计数、均值和方差60 秒窗口计算相同的一分钟窗口?看起来并不明显,例如在上面的维基百科链接中。

标签: algorithm statistics variance


【解决方案1】:

这是对 tibbe 关于如何结合均值和方差的评论的回答。

换句话说,组合均值是均值的均值,组合方差是方差的均值与均值的方差之和。

更正式地说:假设我们有 k 个数据子集的计数 n、均值 m 和方差均值;假设子集不相交,则 k 个子集的并集的计数 N、均值 M 和方差 V 可以通过以下方式计算:

N = Sum{ n[i] }
M = Sum{ w[i]*m[i] }
V = Sum{ w[i]*v[i] } + Sum{ w[i]*(m[i]-M)*(m[i]-M)}
where
w[i] = n[i]/N

【讨论】:

    【解决方案2】:

    我认为您在完全按照说明解决此问题时会遇到问题。

    考虑编码为浮点样本对的比特流 1 = {0.0, 0.0} 0 = {-1.0, 1.0}。如果我将窗口大小的任意比特流编码的结果提供给您的算法,然后发送零流,则您的算法报告的方差将根据刚刚从窗口远边缘掉下来的样本对而波动是 {0.0, 0.0} 或 {-1.0, 1.0}。

    所以我可以使用您的算法来记住大约为滑动窗口一半大小的比特流。因此,如果不使用这么多的存储空间,您的算法将无法实现。

    也许您可以使用某种形式的指数平滑。简单指数平滑等效于加权平均值,其中权重呈指数衰减,如果平滑平方值,您将得到指数加权平方和。如果您还具有未平方值的指数加权和,则可以将两者结合以获得与某个中心值的平方偏差的指数加权和,以获得任何所需的中心值。当然,您需要显着改进这个想法才能获得数值稳定的东西 - 也许这在您引用的 Wikipedia 文章末尾的加权方差算法之一的详细信息中有所介绍。

    【讨论】:

    • 如果算法是近似的(如许多现有的近似在线分位数算法)怎么办?
    • 如果您随机忽略或汇总一些观察值,或者根据某个间隔,您可以将数据减少到可以使用普通窗口将所有观察值存储在一个窗口中的程度窗口方案。总结得到你dmuir的建议。
    猜你喜欢
    • 2012-01-20
    • 2018-12-20
    • 1970-01-01
    • 2013-05-29
    • 2012-08-12
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多