Numpy std(标准差)函数奇怪的行为

2024-01-12

从统计学的角度来看,当所有值相等时标准差应该为 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(使用前将#替换为@)

Numpy std(标准差)函数奇怪的行为 的相关文章