来自Wolfram和numpy的相同输入的标准偏差不同

时间:2011-01-01 20:30:47

标签: java python numpy statistics

我目前正在重新实现一些用Python编写的算法。一步是计算值列表的标准偏差。最初的实现使用了Apache Math 1.1库中的DescriptiveStatistics.getStandardDeviation。我使用numpy 1.5的标准偏差。问题是,它们为相同的输入提供(非常)不同的结果。我的样本是:

[0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842]

我得到以下结果:

numpy           : 0.10932134388775223
Apache Math 1.1 : 0.12620366805397404
Wolfram Alpha   : 0.12620366805397404

我查看Wolfram Alpha以获得第三意见。我不认为这种差异可以仅通过精确来解释。有谁知道为什么会这样,我能做些什么呢?

编辑:在Python中手动计算会产生相同的结果:

>>> from math import sqrt
>>> v = [0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842]
>>> mu = sum(v) / 4
>>> sqrt(sum([(x - mu)**2 for x in v]) / 4)
0.10932134388775223

另外,关于不正确使用它:

>>> from numpy import std
>>> std([0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842])
0.10932134388775223

1 个答案:

答案 0 :(得分:23)

Apache和Wolfram除以N-1而不是N.这是一个自由度调整,因为你估计μ。除以N-1,您可以获得人口标准差的无偏估计。您可以使用ddof选项更改NumPy的行为。

NumPy文档中描述了这一点:

  

平均偏差是   通常计算为x.sum()/ N,   其中N = len(x)。但是,如果ddof是   指定,除数N - ddof是   用来代替。在标准统计中   练习,ddof = 1提供无偏见   估计的方差估计   无限的人口。 ddof = 0提供了一个   最大似然估计   正态分布的方差   变量。标准差   在这个函数中计算的是   估计方差的平方根,   所以即使ddof = 1,它也不会是一个   无偏估计标准   偏离本身。