Python Numpy std(标准偏差)函数异常行为

Python Numpy std(标准偏差)函数异常行为,python,numpy,statistics,Python,Numpy,Statistics,从统计学角度来看,当所有值相等时,标准偏差应为0。 对于arr1而言,结果与预期一致:0,但对于arr2而言,结果是1.387777807814457E-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.st

从统计学角度来看,当所有值相等时,标准偏差应为0。 对于
arr1
而言,结果与预期一致:
0
,但对于
arr2
而言,结果是
1.387777807814457E-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

我试过了,得到了同样的结果。 上面说这是Numpy的一个bug。当你使用小数字时,似乎会发生这种情况。

我试了一下,得到了同样的结果。 上面说这是Numpy的一个bug。当你使用小数字时,似乎会发生这种情况。 各州:

标准偏差是平均值的平方根 与平均值的平方偏差,即
std=sqrt(平均值(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.zero((2512*512),dtype=np.float32)
a[0,:]=1.0
a[1,:]=0.1 np.std(a)
>>>0.45000005 
但是对于
float64

a=np.zero((2512*512),dtype=np.float64)
a[0,:]=1.0
a[1,:]=0.1
np.std(a)
>>>0.45 
各国:

标准偏差是平均值的平方根 与平均值的平方偏差,即
std=sqrt(平均值(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.zero((2512*512),dtype=np.float32)
a[0,:]=1.0
a[1,:]=0.1 np.std(a)
>>>0.45000005 
但是对于
float64

a=np.zero((2512*512),dtype=np.float64)
a[0,:]=1.0
a[1,:]=0.1
np.std(a)
>>>0.45 

这是一个浮点错误。当在std函数中进行操作时,float32值不够精确,无法表示理论值。正如你所见,std是一个非常小的数字。参见np.mean(arr2),它是-0.0870000000000001,我记不起这个例子,但对于大的数字也会出现这个问题。这是一个浮点错误。当在std函数中进行操作时,float32值不够精确,无法表示理论值。正如你所见,std是一个非常小的数字。参见np.mean(arr2)它是-0.0870000000000001,我记不起这个例子,但对于大的数字也会出现问题。首先应该检查“相等”(如果为真,返回0.0)吗?我认为在这种情况下可以避免舍入问题。@QuantChristo是的,它似乎没有检查相等性。首先应该检查“相等”(如果为真,返回0.0)吗?我认为在这种情况下,它可以避免四舍五入的问题。@QuantChristo是的,它似乎没有检查平等性。