用一次迭代计算均值和方差

Rug*_*rra 15 python iterator

我有一个数字迭代器,例如一个文件对象:

f = open("datafile.dat")
Run Code Online (Sandbox Code Playgroud)

现在我想计算:

mean = get_mean(f)
sigma = get_sigma(f, mean)
Run Code Online (Sandbox Code Playgroud)

什么是最好的实施?假设文件很大,我想避免两次阅读.

Nic*_*kis 12

如果要迭代一次,可以编写求和函数:

def mysum(l):
    s2 = 0
    s = 0
    for e in l:
        s += e
        s2 += e * e
    return (s, s2)
Run Code Online (Sandbox Code Playgroud)

并在您的sigma函数中使用结果.

编辑:现在您可以像这样计算方差:(s2 - (s*s)/ N)/ N.

考虑到@Adam Bowen的评论,
请记住,如果我们使用数学技巧并转换原始公式,
我们可能会降低结果.

  • 使用这个解,平均值是's/n`,方差是's2/n - mean*mean`,也就是说,平方的平均值减去平均值的平方.但是,您必须意识到,由于在累积期间s2和e*e之间的比例不同,以这种方式计算方差对于大n可能是不准确的.不幸的是,这意味着对于大n,双通算法更准确(并且是更好的选择). (13认同)
  • 这个答案在[PEP 450](http://www.python.org/dev/peps/pep-0450/)中引用,作为一种简单的方差计算方法的建议,具有较差的稳定性和准确性特征.请参阅建议的Python 3.4+ [`statistics`](http://hg.python.org/cpython/file/tip/Lib/statistics.py)模块中的方差函数. (3认同)

Map*_*pio 5

我认为尼克D有正确的答案.

假设你想在文件的一次扫描中计算均值和方差(并且你真的不想要两个必须一个接一个地调用的函数),你可以收集值和它们的平方和它们的总和使用这样的总和(与读取元素的数量一起)来同时计算均值和方差.

有一些数值稳定性问题,但是这个想法在

http://en.wikipedia.org/wiki/Computational_formula_for_the_variance

是你需要的基本成分.更多细节见

http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

我建议你阅读"Naïve算法".

希望这可以帮助,

马西莫