这是一个简单的测试
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()
是如何工作的吗?
这是一个简单的测试
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
和一个正值:np.std(data, ddof=1)
... 但在这里这样做会重新引入您最初的问题,因为 numpy 将会除以 N - ddof
。
N-1
而不是N
。使用N
然后使用ddof=1
实际上会重新引入原始问题! - BlackVegetable在建议函数/方法不正确之前,阅读其帮助页面是值得的。该方法确切地执行文档字符串所述的操作,即除以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.
std
有点晦涩,我个人认为,特别是考虑到NumPy文档通常相当清晰易懂。如果你阅读得足够深入:平均平方偏差通常被计算为x.sum() / N,其中N = len(x)。然而,如果指定了ddof,则使用除数N - ddof。在标准统计实践中,ddof=1提供了无偏的无限总体方差估计。
(换言之,默认为总体标准差,设置ddof=1
则为样本标准差)。数据向量X的标准差s有两个常见的教科书定义。[公式省略] n是样本中元素的数量。这两种形式的方程只在分母中n-1与n不同。
因此,默认情况下,Matlab计算样本标准差(分母中为N-1,因此更大以补偿这是一个样本),而Numpy计算总体标准差(分母中为N)。您可以使用ddof
参数切换到样本标准差,或者任何其他您想要的分母(超出我的统计知识范围)。ddof
的值,使得 ddof ∉ {0, 1}
? - PythonNut