如何解决Numpy std标准偏差函数怪异行为
从统计角度看,当所有值相等时,标准偏差应为0。
对于arr1
,结果符合预期:0
,但是对于arr2
为1.3877787807814457e-17
-非常小,但不是0
,这会导致例如zscore
。
这是正常行为还是怪异的错误?
import numpy as np
arr1 = [20.0] * 3
#[20.0,20.0,20.0]
arr2 = [-0.087] * 3
#[-0.087,-0.087,-0.087]
np.std(arr1) #0.0
np.std(arr2) #1.3877787807814457e-17
解决方法
标准偏差是与平均值即std = sqrt(mean(abs(x - x.mean())**2))
的平方偏差的平均值的平方根。
平均平方偏差通常计算为x.sum() / N
,其中N = len(x)
。但是,如果指定了ddof,则使用除数N - ddof
。在标准的统计实践中,ddof=1
提供了无穷总体方差的无偏估计量。 ddof=0
为正态分布变量提供方差的最大似然估计。此函数中计算的标准偏差是估计方差的平方根,因此即使使用ddof=1
,也不会是标准偏差本身的无偏估计。
请注意,对于复数,std取平方前的绝对值,因此结果始终是实数且非负数。
对于浮点输入,使用与输入相同的精度来计算std。根据输入数据,这可能导致结果不准确,尤其是对于float32(请参见下面的示例)。使用dtype关键字指定精度更高的累加器可以缓解此问题。
a = np.zeros((2,512*512),dtype=np.float32)
a[0,:] = 1.0
a[1,:] = 0.1
np.std(a)
>>>0.45000005
但针对float64
:
a = np.zeros((2,dtype=np.float64)
a[0,:] = 0.1
np.std(a)
>>>0.45
,
我尝试了一下,得到了相同的结果。 这说明这是Numpy的错误。当您使用较小的数字时,似乎会发生这种情况。 https://github.com/numpy/numpy/issues/8207
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。