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

Bjö*_*lex 12 python java statistics numpy

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

[0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842]
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

numpy           : 0.10932134388775223
Apache Math 1.1 : 0.12620366805397404
Wolfram Alpha   : 0.12620366805397404
Run Code Online (Sandbox Code Playgroud)

我与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
Run Code Online (Sandbox Code Playgroud)

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

>>> from numpy import std
>>> std([0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842])
0.10932134388775223
Run Code Online (Sandbox Code Playgroud)

Tri*_*tan 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,它也不会是标准偏差本身的无偏估计.

  • 你不知道你的回答让我多么开心.谢谢! (2认同)
  • 您可以向Wolfram | Alpha询问"人口标准偏差",以获得与NumPy相同的答案. (2认同)