【问题标题】:How can I efficiently model the sum of Bernoullli random variables?如何有效地模拟伯努利随机变量的总和?
【发布时间】:2011-05-23 10:18:37
【问题描述】:

我正在使用 Perl 来建模一个随机变量 (Y),它是一些 ~15-40k 独立伯努利随机变量 (X_i) 的总和,每个变量都有不同的成功概率 (p_i)。正式地,Y=Sum{X_i} 其中Pr(X_i=1)=p_iPr(X_i=0)=1-p_i

我有兴趣快速回答诸如Pr(Y<=k) 之类的查询(其中给出了k)。

目前,我使用随机模拟来回答此类查询。我根据p_i随机抽取每个X_i,然后将所有X_i值相加得到Y'。我重复这个过程几千次,然后返回部分时间Pr(Y'<=k)

显然,这并不完全准确,尽管随着我使用的模拟次数的增加,准确度会大大提高。

你能想出一个合理的方法来得到准确的概率吗?

【问题讨论】:

  • 有趣的问题,但对于确切概率,您需要在统计书中找到公式或使用微积分自己推导出它。换句话说,这并不是一个真正的编程问题。另一方面,当您确实找到一个声称可以给出答案的公式时,您需要确保该公式与您能够编程的最佳模拟一致。
  • 变量这么多,使用高斯近似应该是安全的。除非你有病态的病例(比如很多 p_i=0)并且需要极高的准确率。
  • @Giacomo Verticale:p_is 通常非常小。在某些情况下,泊松比高斯要好得多。

标签: perl statistics simulation montecarlo


【解决方案1】:

首先,我会避免为此使用内置的 rand,因为它过于依赖底层 C 库实现而不是可靠的(例如,请参阅我的 blog post 指出 @987654327 的范围@ 在 Windows 上的基数为 32,768)。

要使用 Monte-Carlo 方法,我将从已知良好的随机生成器开始,例如 Rand::MersenneTwister 或仅使用 Random.org 的服务之一并为 Y 预先计算 CDF,假设 @987654329 @ 相当稳定。如果每个Y只使用一次,那么预计算CDF显然是没有意义的。

引用Wikipedia

在概率论和统计学中,泊松二项分布是独立伯努利试验之和的离散概率分布。

换句话说,它是成功概率p1, ..., pnn个独立yes/no实验序列中成功次数的概率分布。 (强调我的)

Closed-Form Expression for the Poisson-Binomial Probability Density Function 可能会感兴趣。这篇文章在付费墙后面:

我们讨论了它在计算速度和实现以及简化分析方面的一些优势,后者的示例包括矩的计算以及二项式系数和二项式累积分布函数 (cdf) 的新三角恒等式的开发.

【讨论】:

    【解决方案2】:

    据我记得,这不应该渐近地成为正态分布吗?另请参阅此新闻组主题:http://newsgroups.derkeiler.com/Archive/Sci/sci.stat.consult/2008-05/msg00146.html

    如果是这样,您可以使用Statistics::Distrib::Normal

    【讨论】:

    • 免责声明:我绝对不是该主题的专家,强烈建议您等待某人的回答(Sinan 肯定是)
    【解决方案3】:

    要获得精确的解决方案,您可以利用 the probability distribution of the sum of two or more independent random variables is the convolution of their individual distributions. Convolution 有点昂贵但只有在 p_i 发生变化时才必须计算这一事实。

    获得概率分布后,您可以通过计算概率的累积和轻松获得 CDF。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2018-04-11
      • 1970-01-01
      • 2020-04-23
      • 2019-06-21
      • 2017-06-10
      • 2014-02-05
      相关资源
      最近更新 更多