【问题标题】:Implementing a weighted average on the fly in Python在 Python 中即时实现加权平均
【发布时间】:2018-06-27 17:26:36
【问题描述】:

我有一个即将到来的数据流,我想即时实现移动平均线。如果移动平均线中的所有元素具有相同的权重,则使用“队列”很容易实现,但我希望最近的元素具有更高的权重,并且该权重的分布是线性的(不是指数的)。

例如,如果移动平均线的长度为 5,则当前值的权重应为“1”,前一个值的权重应为“0.8”,依此类推,直到队列中的第五个元素的权重应为“0.2” ';所以权重向量是:[0.2, 0.4, 0.6, 0.8, 1.0]

我想知道是否有人知道如何用 Python 来实现它。如果有任何更快的方法可以做到这一点,请向我推荐;效率对我的具体工作很重要。

【问题讨论】:

  • 可以肯定的是,您是否希望在元素可用时立即估算平均值,并在每次输入新元素时更新?
  • 是的。我想在更新后的移动平均线一到就输出它。

标签: python queue weighted-average


【解决方案1】:

如果您想保留所描述的权重向量(权重线性递减),则需要保留有关过去流的所有信息。我很快尝试画出一个数学函数,以避免将过去的标量保留在记忆中而没有成功。这就是指数加权具有强大优势的地方:

average_(t) = x_(t) + aa*average_(t-1)

您只需要在内存中保留两个变量。

无论如何,如果内存不是效率参数,那么您的问题就会归结为向量乘法。因此,我建议使用 numpy 库。 [1][2]。请参阅下面的解决方案示例(也许您会找到更有效的解决方案):

import numpy as np

stream = np.array((20, 40))
n = len(stream)

latest_scalar = 60
stream = np.append(stream, latest_scalar)

n += 1
# n represent the length of the stream
# I assumed that is more efficient to handle n without calling len() function
# may raise safety issue
weights = np.arange(1, n+1)
# [1, 2, 3]
average = np.dot(stream, weights).sum() / (n*(n+1)/2)
# (n*(n+1)/2): total of the weights
# output: 46.666... ok!

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2021-06-02
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多