Python:Numpy标准差错误

时间:2014-06-05 18:51:24

标签: python numpy

这是一个简单的测试

import numpy as np
data = np.array([-1,0,1])
print data.std()

>> 0.816496580928

我不明白这个结果是如何产生的?显然:

( (1^0.5 + 1^0.5 + 0^0.5)/(3-1) )^0.5 = 1

在matlab中它给了我std([-1,0,1]) = 1。你能帮我理解numpy.std()的工作原理吗?

3 个答案:

答案 0 :(得分:20)

这个问题的症结在于你需要除以N(3),而不是N-1(2)。正如Iarsmans指出的那样,numpy将使用总体方差,而不是样本方差。

所以真正的答案是sqrt(2/3),这正是:0.8164965...

如果您正试图故意使用不同的值(默认值为0)作为自由度,请使用关键字参数ddof,其值为0以外的正值:

np.std(data, ddof=1)

...但是这样这里会重新引入你原来的问题,因为numpy将除以N - ddof

答案 1 :(得分:4)

在建议不正确之前,有必要阅读函数/方法的帮助页面。该方法完全按照文档字符串的说法进行操作,除以3,因为默认情况下ddof为零。

In [3]: numpy.std?

String form: <function std at 0x104222398>
File:        /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition:  numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
Docstring:
Compute the standard deviation along the specified axis.

...

ddof : int, optional
    Means Delta Degrees of Freedom.  The divisor used in calculations
    is ``N - ddof``, where ``N`` represents the number of elements.
    By default `ddof` is zero.

答案 2 :(得分:1)

从Matlab进入NumPy时,您可能希望保留两个方便的文档。它们很相似,但通常在小而重要的细节上有所不同。基本上,他们以不同方式计算标准差。我强烈建议您查看文档,了解计算标准差的任何内容,无论是袖珍计算器还是编程语言,因为默认情况下不是(抱歉!)标准化。

Numpy STD:http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html

Matlab STD:http://www.mathworks.com/help/matlab/ref/std.html

std的Numpy文档有点不透明,恕我直言,特别是考虑到NumPy文档通常相当清楚。如果你阅读得足够多:The average squared deviation is normally calculated as x.sum() / N, where N = len(x). If, however, ddof is specified, the divisor N - ddof is used instead. In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population.(英文版,默认为pop std dev,为示例std dev设置ddof=1

OTOH,Matlab文档清楚地说明了绊倒你的区别:

There are two common textbook definitions for the standard deviation s of a data vector X. [equations omitted] n is the number of elements in the sample. The two forms of the equation differ only in n – 1 versus n in the divisor.

因此,默认情况下,Matlab计算样本标准差(除数中的N-1,因此更大以补偿这是一个样本),Numpy计算总体标准差(除数中的N)。您可以使用ddof参数切换到示例标准或您想要的任何其他分母(超出我的统计知识)。

最后,它对这个问题没有帮助,但你可能会发现这在某些方面很有帮助。 http://wiki.scipy.org/NumPy_for_Matlab_Users