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

gus*_*ans 81 python matlab numpy standard-deviation

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

在matlab中

std([1,3,4,6])
ans =  2.0817
Run Code Online (Sandbox Code Playgroud)

在numpy

np.std([1,3,4,6])
1.8027756377319946
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ley 141

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

>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • 我将在Matlab中添加,`std([1 3 4 6],1)`相当于NumPy的默认`np.std([1,3,4,6])`.所有这些都在Matlab和NumPy的文档中得到了很清楚的解释,因此我强烈建议OP一定要在将来阅读这些内容. (4认同)

hba*_*rts 60

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

方差的定义

因此,方差的估计量将是

有偏见的估计

哪里 样本平均值表示样本均值.随机选择喜,可以证明这个估计量并不收敛于实际方差,而是收敛于

无偏估计

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

无偏估计

这会收敛到 西格玛平方.修正条款n-1个 也被称为贝塞尔的修正.

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

同样,MATLAB允许添加第二个参数w,该参数指定"称重方案".默认值,w=0导致校正项n-1(无偏估计),而对于w=1,仅使用n作为校正项(偏差估计器).

  • 在校正估计量的公式中,不应存在因子*n*(在总和内). (2认同)
  • 方差中n-1项背后的直觉:您已经使用样本来估计用于近似方差的均值.这引入了相关性,因此ddof必须为1. (2认同)

MJM*_*MJM 5

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

  • 包括ddof=1如果你计算np.std()从您的完整数据集取样。

  • 确保ddof=0您计算np.std()的是全部人口

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