【问题标题】:Does np.random.poisson work with very small numbers?np.random.poisson 是否适用于非常小的数字?
【发布时间】:2020-06-16 10:51:17
【问题描述】:

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

这是我的代码的 sn-p:

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 总是返回一个零数组。

rxn_vector = [0 0 0 0]

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

干杯

【问题讨论】:

  • “总是返回零”是什么意思?你拿了多少样品? lambda = 1.5e-4 非常小。
  • 我为每个反应抽取了 4 个样本(我认为)
  • 我添加了一个答案。

标签: python numpy poisson


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2013-07-13
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多