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

Little hardcore: Do you know any parallel modified moving average algorithm?

本文关键字:移动 算法 并行 任何      更新时间:2023-10-16

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

我想快速计算移动平均线,但不要使用顺序算法。我想使用并行算法,但我仍然没有找到解决方案。

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

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)

其他一些算法也很好,但我还没有找到并行算法

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

考虑到我想要以随机时间顺序出现的事件计数 - 早期事件可以比后期事件晚出现 - 您可以假设在处理后期事件(或有一些超时(后可以跳过/过时早期事件。不假设事件的顺序,并且来自同一时间的事件将具有相同的时间


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

如果它使用分片但不是必需的,那就太好了。

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

newMovingAverage = ((MovingAverage * (n - 1)) + newSample) / n

其中n决定了该样本对移动平均线的影响应该有多大(或多小(。n越大,影响越小。随着时间的推移,随着新样本的到来,旧样本对移动平均线的影响将越来越小。

对于不按顺序排列的样本,您可以尝试通过让样本的年龄决定它对移动平均线的影响来模仿这种行为。例如,这可以像这样完成:

influence = (1 + sampleAge)^2 * n 
newMovingAverage = ((MovingAverage * (influence - 1)) + newSample) / influence 

我让sampleAge决定newSample应该在多大程度上影响移动平均线。

拥有并行算法的可能性取决于您正在使用的移动平均线的性质。

您在问题中显示的算法是指数平滑的。因此,数据的第一个值对每个计算的平均值都有影响。第一个值的影响量随着每个新数据点而减小,但即使是序列中的最后一个平均值也会受到第一个数据点的轻微影响。

这种移动平均线无法

并行化,因为如果不使用(显式或隐式(之前收到的所有数据,就无法计算任何平均线。

然而,维基百科关于移动平均线的文章很好地总结了一系列移动平均线方法,其中一些很容易并行实现。

例如,简单移动平均线采用以下形式(对于奇数n(**:

n2 = int(n/2)
moving_average[i] = (data[i-n2] + data[i-n2+1] ... + 
    data[i] + ... + data[i+n2-1] + data[i+n2])/n

此方法不使用早于 int(n/2) i点的任何数据来计算点 i 的移动平均线。因此,您可以将m m项划分为p子序列,每个子序列通过int(n/2)数据点与下一个和上一个(第一个和最后一个子序列除外(子序列重叠,并让每个线程计算其子序列的移动平均值,从而与p线程并行计算数据集的移动平均值。

您可以在问题简单移动平均求和/偏移问题及其答案中找到此算法的有效顺序实现(适用于并行实现的每个线程(。该方法计算的是尾随移动平均线,而不是我上面显示的(可以说是首选的(中心移动平均线。也就是说,它将我上面计算的值放在 moving_average[i+n2] 而不是 moving_average[i] .

** 这排除了数据可能处于不规则时间间隔的可能性。您展示的方法解决了该问题,并且可以在其他方法中以相同的方式处理。