如何避免 numpy.random.choice 中的舍入错误?

How to avoid roundoff errors in numpy.random.choice?

假设x_1, x_2, ..., x_n 是n个对象,想从中选择一个,那么选择x_i的概率是与某个数字成正比 u_i.

x, u = np.array([x_1, x_2, ..., x_n]), np.array([u_1, ..., u_n])
np.random.choice(x, p = u/np.sum(u))

有限精度算法存在舍入误差。人们是否应该担心会因为概率之和不正好为 1 而出错?这个问题有标准的解决方案吗?

根据NumPy documentation我们必须使用p1-D array-like。 所以我认为如果 u-array 是概率数组那么你可以试试:

x, u = np.array([x_1, x_2, ..., x_n]), np.array([u_1, ..., u_n])
np.random.choice(x, p = u)

x, u = np.array([x_1, x_2, ..., x_n]), np.array([u_1, ..., u_n])
s = sum(u)
u1 = [i/s for i in u]
np.random.choice(x, p = u1)

阅读答案后 to the question pointed by @Pychopath, I have found the following solution, inspired by the documentation of numpy.random.multinomial https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.multinomial.html

假设 p 是概率数组,由于舍入误差可能不完全是 1,即使我们用 p = p/np.sum(p) 对其进行归一化。这并不罕见,请参阅@pd shah 在答案 .

中的评论

随心所欲

p[-1] = 1 - np.sum(p[0:-1])
np.random.choice(x, p = p)

问题解决了!由于减法导致的舍入误差将比归一化导致的舍入误差小得多。而且,不用担心p的变化,都是舍入误差量级的。