scipy.stats.norm 对于在不同方法中具有不同精度的值数组

scipy.stats.norm for array of values with different accuracy in different method

生成两个数组:

np.random.seed(1)
x = np.random.rand(30, 2)
np.random.seed(2)
x_test = np.random.rand(5,2)

逐轴计算scipy.stats.norm轴:

gx0 = scipy.stats.norm(np.mean(x[:,0]), np.std(x[:,0])).pdf(x_test[:,0])
gx1 = scipy.stats.norm(np.mean(x[:,1]), np.std(x[:,1])).pdf(x_test[:,1])

并得到:

gx0 = array([1.29928091, 1.1344507 , 1.30920536, 1.10709298, 1.26903949])
gx1 = array([0.29941644, 1.36808598, 1.13817727, 1.34149231, 0.95054596])

使用 NumPy 广播计算

gx = scipy.stats.norm(np.mean(x, axis = 0), np.std(x, axis = 0)).pdf(x_test)

并得到:

gx = array([[1.29928091, 0.29941644],
       [1.1344507 , 1.36808598],
       [1.30920536, 1.13817727],
       [1.10709298, 1.34149231],
       [1.26903949, 0.95054596]])

gx[:,0] 和 gx0 看起来一样,但是从另一个 gx[:,0] - gx0 中减去一个会得到:

array([-4.44089210e-16, -2.22044605e-16, -4.44089210e-16,  0.00000000e+00,
        0.00000000e+00])

这是为什么?

不确定他们为什么计算不同精度的答案,但将输入数组转换为 128 位浮点数解决了问题:

np.random.seed(1)
x = np.random.rand(30, 2).astype(np.float128)
np.random.seed(2)
x_test = np.random.rand(5,2).astype(np.float128)

...

print(gx[:,0] - gx0)

结果:

[0. 0. 0. 0. 0.]