我尝试将matlab代码转换为numpy,并发现numpy与std函数的结果不同。
在matlab中
std([1,3,4,6])
ans = 2.0817
in numpy
np.std([1,3,4,6])
1.8027756377319946
这是正常的吗?我该怎么处理呢?
答案 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
的方差定义为
因此,方差的估算器将是
其中表示样本均值。对于随机选择的,可以证明此估计量不会收敛到实际方差,而是
如果您随机选择样本并估计样本均值和方差,则必须使用经过校正(无偏)的估算
将收敛到。修正项也称为贝塞尔修正。
现在默认情况下,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,以抵消数字中可能出现的偏差。