我使用Perl来建模一个随机变量(Y
),它是一些~15-40k个独立伯努利随机变量(X_i
)的总和,每个变量具有不同的成功概率{{{ 1}})。形式上,p_i
Y=Sum{X_i}
和Pr(X_i=1)=p_i
。
我有兴趣快速回答Pr(X_i=0)=1-p_i
(其中Pr(Y<=k)
已提供)等问题。
目前,我使用随机模拟来回答此类查询。我根据k
随机抽取每个X_i
,然后将所有p_i
值相加得到X_i
。我重复这个过程几千次并返回Y'
次的分数。
显然,这并不完全准确,但随着我使用的模拟数量的增加,准确度会大大提高。
你能想出一个合理的方法来获得确切的概率吗?
答案 0 :(得分:3)
首先,为了达到这个目的,我会避免使用rand
内置过于依赖底层C库实现是可靠的(例如,请参阅我的blog post指出Windows上rand
的范围具有基数32,768)。
要使用蒙特卡罗方法,我将从一个已知良好的随机生成器开始,例如Rand::MersenneTwister或者只使用Random.org的一个服务并为{{预先计算CDF 1}}假设Y
非常稳定。如果每个Y
仅使用一次,那么预先计算CDF显然是毫无意义的。
引用Wikipedia:
在概率论和统计学中, 泊松二项分布 是独立伯努利试验总和的离散概率分布。
换句话说,它是 n 序列中成功次数的概率分布,独立的是/否实验,成功概率 p1,...,pn 。 (强调我的)
Closed-Form Expression for the Poisson-Binomial Probability Density Function可能会引起人们的兴趣。这篇文章是付费墙的背后:
我们讨论了它在计算速度和实现以及简化分析方面的几个优点,后者的例子包括矩的计算和二项式系数和二项式累积分布函数(cdf)的新三角恒等式的开发。
答案 1 :(得分:1)
据我所知,这不应该像正态分布一样渐渐渐近吗?另请参阅此新闻组主题:http://newsgroups.derkeiler.com/Archive/Sci/sci.stat.consult/2008-05/msg00146.html
如果是,您可以使用Statistics::Distrib::Normal。
答案 2 :(得分:1)
要获得准确的解决方案,您可以利用the probability distribution of the sum of two or more independent random variables is the convolution of their individual distributions. Convolution有点贵的事实,但只有在p_i
更改时才必须计算。
一旦获得概率分布,就可以通过计算概率的累积和来轻松获得CDF。