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.
当你从Matlab进入NumPy时,你可能想把两者的文档放在手边。它们很相似,但往往在一些小而重要的细节上有所不同。基本上,它们计算标准差的方式不同。我强烈建议你检查一下文档中计算标准差的任何东西,不管是袖珍计算器还是编程语言,因为默认值不是(抱歉!)标准化的。 麻木标准:http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html Matlab标准: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,设置ddof=1为样本std dev)。 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参数切换到样本标准,或任何其他想要的分母(这超出了我的统计学知识)。 最后,它对这个问题没有帮助,但您可能会发现它在某个时候很有用。Link
3条答案
按热度按时间yyhrrdl81#
这个问题的关键是你需要除以
N
(3),而不是N-1
(2),正如Iarsmans所指出的,numpy将使用总体方差,而不是样本方差。所以真实的的答案是
sqrt(2/3)
,也就是:0.8164965...
如果您碰巧尝试故意为自由度使用不同的值(而不是默认值0),请使用带有非0正值的关键字参数
ddof
:...但是在 * 此处 * 这样做会重新引入原来的问题,因为numpy将除以
N - ddof
。rjzwgtxy2#
在指出这个函数/方法不正确之前,请先阅读帮助页面。这个方法完全按照doc-string的要求执行,即除以3,因为默认情况下
ddof
为零。:ql3eal8s3#
当你从Matlab进入NumPy时,你可能想把两者的文档放在手边。它们很相似,但往往在一些小而重要的细节上有所不同。基本上,它们计算标准差的方式不同。我强烈建议你检查一下文档中计算标准差的任何东西,不管是袖珍计算器还是编程语言,因为默认值不是(抱歉!)标准化的。
麻木标准:http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html
Matlab标准: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,设置ddof=1
为样本std dev)。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
参数切换到样本标准,或任何其他想要的分母(这超出了我的统计学知识)。最后,它对这个问题没有帮助,但您可能会发现它在某个时候很有用。Link