numpy-为什么均值和标准差对于相同的值不稳定? 问题:

numpy-为什么均值和标准差对于相同的值不稳定? 问题:,numpy,rounding-error,Numpy,Rounding Error,为什么相同的值-3.29686744会导致不同的平均值和标准偏差 预期 结果: mean is [-1.11793447 -3.29686744 -3.50615096] X-mean is [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] SD is [0. 0. 0.] 想不到的 结果是: mean is [-1.11793447 -3.29686744 -3.50615096] X-mean is [[0.0000000e+00 4.4408921e-

为什么相同的值
-3.29686744
会导致不同的平均值和标准偏差

预期 结果:

mean is 
[-1.11793447 -3.29686744 -3.50615096]
X-mean is 
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

SD is 
[0. 0. 0.]
想不到的 结果是:

mean is 
[-1.11793447 -3.29686744 -3.50615096]
X-mean is 
[[0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]]

SD is 
[0.0000000e+00 4.4408921e-16 4.4408921e-16]

<>这是正常的行为,当你认为IEEE-75 4双精度浮点被存储为64位数据。53位是尾数,10位是指数,1位是符号。你可以在别处查阅详情

重要的部分是,浮点有效地存储为带有比例因子的整数。这是科学记数法的二进制模拟。事实上,您可以使用更熟悉的十进制科学记数法准确地直观地了解正在发生的事情

假设您有三位十进制精度,您想计算
[2.31e2,2.31e2,2.31e2]
的平均值。总和是
6.93e2
,因此平均值是明确的
2.31e2
。但是如果您的数组是
[2.31e2,2.31e2,2.31e2,2.31e2,2.31e2]
,该怎么办呢。现在的总和是
1.155e3
,但由于只有三位数字可用,因此根据截断还是四舍五入,您最多只能选择
1.15e3
1.16e3
。除以5并截断/四舍五入可以得到
2.30e2
2.32e2
。当你的和与你原来的数字不同时,通常会有一些量化误差

希望您可以看到,这也直接转化为二进制表示:您可以看到在平均值操作期间,最后一个数字与比例变化之间的差异

请注意
2^-53~=1.11e-16
。假设
X
中所有元素的比例约为1,这与您看到的量化误差非常对应


这与

1 ulp加起来非常密切,因为您计算了更多项目的平均值
X = np.array([
    [-1.11793447, -3.29686744, -3.50615096],
    [-1.11793447, -3.29686744, -3.50615096],
    [-1.11793447, -3.29686744, -3.50615096],
    [-1.11793447, -3.29686744, -3.50615096],
    [-1.11793447, -3.29686744, -3.50615096]
])

mean = np.mean(X, axis=0)
print(f"mean is \n{mean}\nX-mean is \n{X-mean}\n")

sd = np.std(X, axis=0)
print(f"SD is \n{sd}\n")
mean is 
[-1.11793447 -3.29686744 -3.50615096]
X-mean is 
[[0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]
 [0.0000000e+00 4.4408921e-16 4.4408921e-16]]

SD is 
[0.0000000e+00 4.4408921e-16 4.4408921e-16]