从统计学的角度来看,当所有值相等时标准差应该为 0。
为了arr1
结果符合预期:0
, 但对于arr2
is 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
The Numpy 文档std https://numpy.org/doc/stable/reference/generated/numpy.std.html states:
标准差是平均值的平方根
与平均值的偏差平方,即std = sqrt(mean(abs(x - x.mean())**2))
.
平均平方偏差通常计算为x.sum() / N
,
where 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
but for float64
:
a = np.zeros((2, 512*512), dtype=np.float64)
a[0, :] = 1.0
a[1, :] = 0.1
np.std(a)
>>>0.45
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)