为什么numpy std()给matlab std()一个不同的结果?

时间:2014-12-22 09:52:11

标签: python matlab numpy standard-deviation

我尝试将matlab代码转换为numpy,并发现numpy与std函数的结果不同。

在matlab中

std([1,3,4,6])
ans =  2.0817

in numpy

np.std([1,3,4,6])
1.8027756377319946

这是正常的吗?我该怎么处理呢?

3 个答案:

答案 0 :(得分:136)

NumPy函数np.std采用可选参数ddof:“Delta Degree of Freedom”。默认情况下,这是0。将其设置为1以获得MATLAB结果:

>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326

为了增加一点上下文,在方差的计算中(标准偏差是平方根),我们通常除以我们所拥有的值的数量。

但是,如果我们从较大的分布中选择N元素的随机样本并计算方差,则除以N会导致低估实际方差。要解决此问题,我们可以将我们除以(the degrees of freedom)的数字降低到小于N的数字(通常为N-1)。 ddof参数允许我们按照指定的数量更改除数。

除非另有说明,否则NumPy将计算方差的偏差估算值(ddof=0除以N)。如果您正在处理整个分布(而不是从较大分布中随机选取的值的子集),那么这就是您想要的。如果给出ddof参数,则NumPy会改为N - ddof

MATLAB的std的默认行为是通过除以N-1来校正样本方差的偏差。这消除了标准偏差中的一些(但可能不是全部)偏差。如果您在较大分布的随机样本上使用该函数,则可能是您想要的。

@hbaderts的好答案提供了更多的数学细节。

答案 1 :(得分:59)

标准差是方差的平方根。随机变量X的方差定义为

definition of variance

因此,方差的估算器将是

biased estimator

其中sample mean表示样本均值。对于随机选择的xi,可以证明此估计量不会收敛到实际方差,而是

unbiased estimator

如果您随机选择样本并估计样本均值和方差,则必须使用经过校正(无偏)的估算

unbiased estimator

将收敛到sigma squared。修正项n-1也称为贝塞尔修正。

现在默认情况下,MATLAB std使用更正项n-1计算无偏估算器。然而,NumPy(如@ajcr所解释的)计算偏差估计器,默认情况下没有校正项。参数ddof允许设置任何更正项n-ddof。通过将其设置为1,您可以获得与MATLAB中相同的结果。

类似地,MATLAB允许添加第二个参数w,它指定"称重方案"。默认值w=0会产生更正项n-1(无偏估计),而对于w=1,只有n用作校正项(偏差估算器)。

答案 2 :(得分:3)

对于不太了解统计数据的人来说,简单的指南是:

  • 如果您正在为从完整数据集中提取的样本计算ddof=1,请加入np.std()

  • 如果您为完整人口计算ddof=0,请确保np.std()

样本中包含DDOF,以抵消数字中可能出现的偏差。