为什么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 

这是正常的吗? 我该如何处理呢?

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

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

为了增加更多的上下文,在计算方差(其中标准偏差是平方根)时,我们通常除以我们具有的值的数量。

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

除非另有说明,否则NumPy将计算方差的偏差估计量( ddof=0 ,除以N )。 如果您正在处理整个分配(而不是从更大的分配中随机选取的值的子集),则这就是您想要的。 如果给定了ddof参数,则NumPy将被N - ddof分割。

MATLAB std的默认行为是通过除以N-1来纠正样本方差的偏差。 这消除了标准偏差中的一些(但可能不是全部)偏差。 如果你在一个更大的发行版的随机样本上使用这个函数,这很可能是你想要的。

@hbaderts的好的答案给出了进一步的math细节。

标准偏差是方差的平方根。 随机variablesX的方差定义为

方差的定义

因此,估计方差是

有偏差的估计量

哪里 样本平均值 表示样本均值。 对于随机select 喜 ,可以看出,这个估计量不会收敛到实际的方差,而是收敛于

无偏估计量

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

无偏估计量

这将汇聚到 西格玛平方 。 修正术语 n-1个 也被称为贝塞尔的纠正。

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

同样,MATLAB允许添加第二个参数w ,它指定了“称重scheme”。 默认值w=0导致校正项n-1 (无偏估计器),而对于w=1 ,只有n被用作校正项(偏差估计器)。

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

  • 如果你正在计算np.std()来从你的完整数据集中提取一个样本,那么包括ddof=1

  • 确保ddof=0如果你计算np.std()为整个人口

为了平衡在数字中可能出现的偏差,DDOF包含在样本中。

    Interesting Posts