【发布时间】:2020-10-03 19:23:08
【问题描述】:
我想从二项分布 B(n,p) 中采样,但有一个额外的约束,即采样值属于 [a,b] 范围(而不是正常的 0 到 n 范围)。换句话说,我必须从二项分布中采样一个值,因为它位于 [a,b] 范围内。在数学上,我可以将这个分布的 pmf (f(x)) 写成二项分布 bin(x) = [(nCx)*(p)^x*(1-p)^(n-x)] 的 pmf 为
sum = 0
for i in range(a,b+1):
sum += bin(i)
f(x) = bin(x)/sum
从该分布中采样的一种方法是采样一个均匀分布的数字并应用 CDF 的倒数(使用 pmf 获得)。但是,我认为这不是一个好主意,因为 pmf 计算很容易变得非常耗时。
在我的情况下n,x,a,b 的值非常大,由于nCx 中的阶乘项,这种计算 pmf 然后使用统一随机变量生成样本的方式似乎效率极低。
有什么好的/有效的方法来实现这一点?
【问题讨论】:
-
我认为二项分布的范围必须是从 0 到 n。你能为我提供这个问题背后的进一步数学的链接吗?我想了解更多。
-
另外,如果您在优化代码时遇到问题,我建议您使用 NumPy 来向量化您的计算。它比 for 循环快 100 倍
-
我找到了一个无错误且有效的解决方案,它允许为数百万个项目计算
pmf和cdf。它需要使用scipy.stats.binom。这对我来说是新事物,因为到目前为止我只知道scipy.special.comb具有误导性。 -
@KevinChoi 我在我的项目中模拟二项式 RV
x以获得另一个 RVy,它是x的函数。但是,y也有范围[0,n]。为了确保y = f(x)在可接受的范围内,需要对x施加一个条件,归结为在[a,b]之间二项式选择x。
标签: python numpy random binomial-cdf