我有一个数字迭代器,例如一个文件对象:
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的评论,
请记住,如果我们使用数学技巧并转换原始公式,
我们可能会降低结果.
我认为尼克D有正确的答案.
假设你想在文件的一次扫描中计算均值和方差(并且你真的不想要两个必须一个接一个地调用的函数),你可以收集值和它们的平方和它们的总和使用这样的总和(与读取元素的数量一起)来同时计算均值和方差.
有一些数值稳定性问题,但是这个想法在
http://en.wikipedia.org/wiki/Computational_formula_for_the_variance
是你需要的基本成分.更多细节见
http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
我建议你阅读"Naïve算法".
希望这可以帮助,
马西莫