小核心:你知道任何并行修改的移动平均算法吗?

Cha*_*eon 4 c++ python java algorithm parallel-processing

你知道任何并行修改的移动平均算法吗?

我想快速计算移动平均值,但不能使用顺序算法.我想使用并行算法,但我还没有找到解决方案.

我找到的最好的算法是用于测量计算机性能的顺序算法修改移动平均:

new_avg =  alfa(new_time, previous_time) * new_value + (1-alfa(new_time, previous_time)) * previous_avg

alfa(new_time, previous_time) = 1- exp(-(new_time - previous_time)/moving_period)
Run Code Online (Sandbox Code Playgroud)

其他一些算法也不错,但我还没有找到并行算法.

这是一个很难的问题,我需要一些帮助.

考虑到我希望计数事件将以随机时间顺序出现 - 早期事件可以在晚期事件之后出现 - 您可以假设在处理延迟事件(或者有一些超时)之后可以跳过早期事件/变得过时.不假设事件的顺序时间顺序,并且同一时间的事件将同时出现.


我不想使用任何需要记住许多样本的算法(尤其是所有)它应该只记住时间和先前的平均值可能是一些额外的值但不是全部或相同的样本.考虑到该算法可以使一些小错误不需要是完美的,如果它的原因是一些性能提升.

如果它将使用分片但不是必需的将是非常好的.

Ebb*_*sen 5

事件按顺序到达的移动平均线可以这样做:

newMovingAverage = ((MovingAverage * (n - 1)) + newSample) / n
Run Code Online (Sandbox Code Playgroud)

n决定了这个样本对移动平均线的影响有多大(或很小).越大n,影响越小.随着时间的推移,随着新样本的到来,旧样本对移动平均线的影响将越来越小.

如果样本不按顺序排列,您可以尝试通过让样本的年龄决定它应该对移动平均线有多大的影响来模仿该行为.这可以这样做:

influence = (1 + sampleAge)^2 * n 
newMovingAverage = ((MovingAverage * (influence - 1)) + newSample) / influence 
Run Code Online (Sandbox Code Playgroud)

我在哪里sampleAge决定newSample应该对移动平均线有多大影响.