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的好答案提供了更多的数学细节.
hba*_*rts 60
标准偏差是方差的平方根.随机变量的方差X定义为

因此,方差的估计量将是

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

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

这会收敛到
.修正条款
也被称为贝塞尔的修正.
现在默认情况下,MATLABs 使用校正项std计算无偏估计n-1.然而,NumPy(正如@ajcr解释的那样)计算偏差估计量,默认情况下没有校正项.该参数ddof允许设置任何校正项n-ddof.通过将其设置为1,您可以获得与MATLAB中相同的结果.
同样,MATLAB允许添加第二个参数w,该参数指定"称重方案".默认值,w=0导致校正项n-1(无偏估计),而对于w=1,仅使用n作为校正项(偏差估计器).
对于不擅长统计的人来说,一个简单的指南是:
包括ddof=1如果你计算np.std()从您的完整数据集取样。
确保ddof=0您计算np.std()的是全部人口
样本包含 DDOF 以抵消数字中可能出现的偏差。