小硬核:你知道任何并行修正的移动平均算法吗?
Little hardcore: Do you know any parallel modified moving average algorithm?
你知道任何并行修正的移动平均算法吗?
我想快速计算移动平均线,但不要使用顺序算法。我想使用并行算法,但我仍然没有找到解决方案。
我发现最好的算法是用于测量计算机性能的顺序算法修改移动平均线:
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]
.
** 这排除了数据可能处于不规则时间间隔的可能性。您展示的方法解决了该问题,并且可以在其他方法中以相同的方式处理。
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何使用 GPS 和指南针开发点移动算法
- 在 stl 算法中移动迭代器
- 我可以在移动平台上有效地使用用C/C 编写的数字算法
- 带有 SFML 的 c++ 中的过程无法正常工作,移动算法
- 用于将优先级链接移动到列表标题的算法
- 骑士团索引和移动算法错误
- 算法,用于查找获取排序列表所需的最小移动元素到结束步骤
- 如何在BFS算法中计算移动?(迷宫中的最短路径)
- 有没有解决方案而不是在C++中移动背包回溯算法
- 没有对角线移动的Dijkstra算法
- 通过贪婪算法找到最小移动次数
- 在电子邮件地址内移动点(句点)的算法
- 基于图像的计数算法,用于对移动输送机上的物体进行计数
- 沿直线移动的算法
- 小硬核:你知道任何并行修正的移动平均算法吗?
- 我是否需要知道算法的代码才能利用插入器和移动迭代器?
- 作用于可移动但不可复制对象序列的变化STL算法的行为