Python:数值标准差错误

afdcj2ne  于 2023-01-08  发布在  Python
关注(0)|答案(3)|浏览(132)

这是一个简单的测试

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

yyhrrdl8

yyhrrdl81#

这个问题的关键是你需要除以N(3),而不是N-1(2),正如Iarsmans所指出的,numpy将使用总体方差,而不是样本方差。
所以真实的的答案是sqrt(2/3),也就是:0.8164965...
如果您碰巧尝试故意为自由度使用不同的值(而不是默认值0),请使用带有非0正值的关键字参数ddof

np.std(data, ddof=1)

...但是在 * 此处 * 这样做会重新引入原来的问题,因为numpy将除以N - ddof

rjzwgtxy

rjzwgtxy2#

在指出这个函数/方法不正确之前,请先阅读帮助页面。这个方法完全按照doc-string的要求执行,即除以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.
ql3eal8s

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

相关问题