np.random.poisson 是否适用于非常小的数字?

Does np.random.poisson work with very small numbers?

我正在尝试模拟随时间变化的反应系统。为了做到这一点,我必须将反应发生的概率值乘以它可能发生的预先计算的时间步长,将此结果保存在新变量中并使用新变量从泊松分布中采样。

这是我的代码片段:

lam = (evaluate_propensity*delta_t)    
rxn_vector = np.random.poisson(lam) # probability of a reaction firing in the given time period

我编写了一个函数来根据系统特定参数计算 delta_t 的值,计算出的值非常小 0.00014970194372884217 我认为这对 np.random.poisson 函数。

evaluate_propensity 变量是一个数组,它根据系统中分子的数量和反应中分子之间的比率详细说明了反应发生的概率。这是动态计算的,每次迭代后随着分子数的变化而变化,但第一次迭代的值为:

evaluate_propensity = np.array([1.0, 0.002, 0.0, 0.0])

文档指出 lam 必须是 >= 0 而我的是(只是)但是 rxn_vector 总是 returns 一个零数组。

rxn_vector = [0 0 0 0]

我知道数组的最后两个元素的计算结果为零。但没想到前两个也一样。有没有办法让它更敏感或以某种方式放大我的结果,或者我做错了什么?

干杯

lambda = 1.5e-4抽到非零数的概率很小,是P(k>0) = 1 - P(k=0) = 1.5e-4。平均而言,您必须绘制四个以上的样本才能获得非零值,1 / 1.5e-4 = 6667 个样本 propensity = 1。对于较小的值,必要的样本数显然更大。

您可以通过 scipy.stats

确认
from scipy.stats import poisson

pdist = poisson(1.5e-4)
prob = 1 - pdist.pmf(0)
print(prob) # 0.00014998875056249084