Python:Numpy标准偏差错误

Python:Numpy标准偏差错误,python,numpy,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()是如何工作的吗?这个问题的关键是你需要除以N(3),而不是N-1(2)。正如Iarsm

这是一个简单的测试

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()
是如何工作的吗?

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

所以真正的答案是
sqrt(2/3)
,也就是说:
0.8164965…

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

np.std(data, ddof=1)

。。。但是在这里这样做会重新引发您原来的问题,因为numpy将除以
N-ddof

在建议函数/方法不正确之前,值得先阅读帮助页面。该方法完全执行文档字符串所说的操作,除以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.
[3]中的
:numpy.std?
字符串形式:
文件:/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromneric.py
定义:numpy.std(a,axis=None,dtype=None,out=None,ddof=0,keepdims=False)
文档字符串:
计算沿指定轴的标准偏差。
...
ddof:int,可选
表示自由度的增量。计算中使用的除数
是``N-ddof`,其中``N``表示元素的数量。
默认情况下,“ddof”为零。

从Matlab进入NumPy时,您可能希望将文档放在手边。它们很相似,但往往在小而重要的细节上有所不同。基本上,他们计算标准偏差的方式不同。我强烈建议您检查文档中用于计算标准偏差的任何内容,无论是袖珍计算器还是编程语言,因为默认值不是(对不起!)标准化的

Numpy标准:

Matlab标准:

std的Numpy文档有点不透明,尤其是考虑到Numpy文档通常相当清晰。如果你读得足够远:
平均平方偏差通常计算为x.sum()/N,其中N=len(x)。但是,如果指定了ddof,则使用除数N-ddof。在标准统计实践中,ddof=1提供了无限总体方差的无偏估计值。
(在英语中,默认值为pop std dev,对于样本std dev,设置
ddof=1

OTOH,Matlab文档明确了让你困惑的区别:

数据向量X的标准偏差s有两种常见的教科书定义。[方程式省略]n是样本中的元素数。方程的两种形式仅在n–1与除数n方面不同。

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


最后,它对这个问题没有帮助,但您可能会在某个时候发现它很有帮助

除以N-1得到样本方差,但NumPy计算总体方差。因为在结果不匹配之前,很少注意总体和样本标准偏差之间的差异,所以给它上一票-选择一个,并知道为什么要使用它,这既有助于防止这个问题,也会迫使你更有效地思考你的问题。(都是从不愉快的经历中说的。)对不起,2只是打字错误。我认为np.std()只是通用的std。如果它是一个示例std,那么它应该是N-1。样本std有函数吗?@MacSanhe啊,那么你怎么会犯这样的错误就更有意义了@MacSanhe编辑了详细信息以解决您的问题。这似乎不正确。numpy文档表明默认情况下使用未修正的样本标准偏差,ddof=0。ddof=1将启用总体方差(使其较少偏向样本平均值)。还是我遗漏了什么?让我检查一下,自从我写下这个答案以来,情况是否发生了变化。出于好奇,我什么时候需要使用
ddof
的值,以便
ddof∉ {0,1}
?我不知道,我只使用过这两个。也许你可以问我一个问题