如何避免 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的变化,都是舍入误差量级的。
假设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)
阅读答案后
假设 p
是概率数组,由于舍入误差可能不完全是 1
,即使我们用 p = p/np.sum(p)
对其进行归一化。这并不罕见,请参阅@pd shah 在答案
随心所欲
p[-1] = 1 - np.sum(p[0:-1])
np.random.choice(x, p = p)
问题解决了!由于减法导致的舍入误差将比归一化导致的舍入误差小得多。而且,不用担心p的变化,都是舍入误差量级的。