有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中计算特定最后n个持续时间移动平均值的公式

我遇到了一个用例,在这个用例中,我应该计算一个特定持续时间的移动平均值,比如说最近n天的移动平均值。我知道,如果我存储所有过去的数据,我可以减去前几天的贡献,那么这可以很容易地实现。但我如何有效地计算它,只存储前几天的平均值,而不存储前几天的数据

下面是我想要完成的

例如,我有5天的数据,比如2,8,5,2,5,其平均值为4.4 现在,如果第八天的数据为10,则应计算运行平均值,忽略前3个元素2、8和5,因此平均值为3.2
目前,我采用的方法是确定一天的平均贡献,然后用我认为不准确的总平均值减去它

 Formula = (avg for past n days) +  (today's count/n) - 
-(no_of_days from the last computed day * (avg for past n days)/n)

那么,有人能为我推荐一个有效的实现/计算公式吗


共 (2) 个答案

  1. # 1 楼答案

    But how do i effectively compute it only storing the previous days average without the previous data.

    你不能。一个简单的滚动平均线或移动平均线要求你记住区间内的所有值。没有(有用的)1公式允许您以其他方式进行操作

    然而,这并不是结束。还有其他滚动平均值度量,不需要存储所有值;e、 g.“加权移动平均线”、“累积移动平均线”、“指数移动平均线”等。关于Moving Averages的维基百科提供了一个很好的概述,描述了各种度量的属性并提供了公式

    我建议你读一下这一页,然后做出选择。在Java中实现任何一个滚动平均度量都应该是一项简单的编程任务


    1-你可以发明一个无用的。。。这依赖于存储从原始值派生的N个其他值。但我不认为这会有帮助

  2. # 2 楼答案

    你所要求的是不可能的,你已经扔掉了数据,因此无法神奇地将其取回

    您只需执行以下操作即可计算移动平均线:

    averageSoFar = (averageSoFar+scoreForToday) / 2
    

    这在很大程度上加重了它对今天的影响,尽管你可能想要的是一个比率,即从今天得到多少,从目前的平均水平得到多少。例如,如果你想要一个10天移动平均线,那么它的起点是0.1

    averageSoFar = averageSoFar *(1-weightingFactor)+scoreForToday*weightingFactor
    

    实际上,您应该保留数据,或者查找正确的算法,以准确地获得所需的数据