我目前正在重新实现一些用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
答案 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,它也不会是一个 无偏估计标准 偏离本身。