为什么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样本并估计样本均值和方差,则必须使用校正(无偏)估计
这将汇聚到 。 修正术语 也被称为贝塞尔的纠正。
现在,默认情况下,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包含在样本中。