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

2022-09-04 08:07:06

我目前正在努力重新实现一些用Python编写的Java算法。一个步骤是计算值列表的标准偏差。原始实现使用Apache Math 1.1库中的DevialmentalStatistics.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

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

这在NumPy文档中进行了描述:

平均平方偏差通常计算为 x.sum() / N,其中 N = len(x)。但是,如果指定了 ddof,则使用除数 N - ddof。在标准统计实践中,ddof=1 提供了无限总体方差的无偏估计器。ddof=0 提供正态分布变量方差的最大似然估计值。此函数中计算的标准差是估计方差的平方根,因此即使 ddof=1,它也不会是标准差本身的无偏估计值。


答案 2