提问者:小点点

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


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

在matlab

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

在numpy

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

这正常吗?我该怎么处理?


共3个答案

匿名用户

NumPy函数np. std接受一个可选参数ddof:“Delta De的自由度”。默认情况下,这是0。将其设置为1以获得MATLAB结果:

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

为了添加更多上下文,在计算方差(均方差为平方根)时,我们通常除以我们拥有的值的数量。

但是如果我们从更大的分布中选择一个N元素的随机样本并计算方差,被N除以可能会导致低估实际方差。为了解决这个问题,我们可以将我们除以的数字(自由度)降低到小于N(通常是N-1)的数字。ddof参数允许我们按我们指定的量更改除数。

除非另有说明,否则NumPy将计算方差的有偏估计量(ddof=0,除以N)。如果您使用的是整个分布(而不是从更大的分布中随机挑选的值子集),这就是您想要的。如果给出ddof参数,NumPy将除以N-ddof

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

@hbaderts给出了更详细的数学答案。

匿名用户

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

因此,差异的估计数将是

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

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

类似地,MATLAB允许添加第二个参数w,它指定“加权方案”。默认值w=0产生校正项n-1(无偏估计量),而对于w=1,只有n用作校正项(有偏估计量)。

匿名用户

对于那些不擅长统计的人来说,一个简单的指南是:

>

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

    如果您正在计算np. std()的全部人口,请确保ddof=0

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