如何计算无限迭代的运行平均值?

问题描述 投票:0回答:2

我想计算无限(或大量)迭代的运行平均值:

import random
epochs = 1e10
for epoch in range(epochs):
    new_value = random.randint(1, 100)
    new_running_average = get_avg(previous_average, new_value) # what is this function going to be?

最简单的方法是将任何新值

new_value
添加到列表中,然后在每次迭代时对列表进行平均。但是,这是不现实的,因为 1) 迭代次数太大,2) 我必须为许多参数创建许多这样的平均值。

我发现的有关计算运行平均值的现有 SO 问题(例如,thisthis)使用相对较小的修复数据列表,因此相当简单。

python average moving-average
2个回答
1
投票

您需要跟踪平均值中已有的数字数量:

def get_avg(nums_in_average, previous_average, new_value):
    return ((nums_in_average*previous_average)+new_value)/(nums_in_average + 1)

0
投票

假设您的源是一个迭代器(或可迭代器),您可以创建一个生成器函数,该函数将遍历它并在运行时吐出当前平均值。不需要桌子:

def runAvg(source):
    average = 0
    for count,value in enumerate(source,1):
        average = (average*(count-1) + value) / count
        yield value, average

用途:

import random

epochs = int(1e10)
source = (random.randint(1, 100) for _ in range(epochs))
for value,average in runAvg(source):
    print(value,average)

72 72.0
96 84.0
94 87.33333333333333
38 75.0
36 67.2
86 70.33333333333333
47 67.0
91 70.0
80 71.11111111111111
16 65.6
23 61.72727272727273
25 58.666666666666664
40 57.23076923076923
...
© www.soinside.com 2019 - 2024. All rights reserved.