我尝试将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 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,以抵消数字中可能出现的偏差。