从Python中的β-二项式分布进行有效采样



对于随机模拟,我需要绘制大量beta二项式分布的随机数。

目前我以这种方式实施(使用python):

import scipy as scp
from scipy.stats import rv_discrete
class beta_binomial(rv_discrete):
       """
       creating betabinomial distribution by defining its pmf
       """
       def _pmf(self, k, a, b, n):
          return scp.special.binom(n,k)*scp.special.beta(k+a,n-k+b)/scp.special.beta(a,b)

因此,对随机数x进行抽样可以通过:

来完成:
betabinomial = beta_binomial(name="betabinomial")
x = betabinomial.rvs(0.5,0.5,3) # with some parameter 

问题是,对一个随机数进行采样。0.5ms,在我的情况下,这是整个模拟速度的主导。限制元素是评估beta函数(或其中γ函数)。

有人有一个好主意如何加快抽样吗?

好吧,这里使用的是使用beta-binomial的复合分布属性的速度和轻微测试的代码。

我们从beta中采样p,然后将其用作二项式的参数。如果您要采样大尺寸的向量,它将更快。

import numpy as np
def sample_Beta_Binomial(a, b, n, size=None):
    p = np.random.beta(a, b, size=size)
    r = np.random.binomial(n, p)
    return r
np.random.seed(777777)
q = sample_Beta_Binomial(0.5, 0.5, 3, size=10)
print(q)

输出是

[3 1 3 2 0 0 0 3 0 3]

快速测试

np.random.seed(777777)
n = 10
a = 2.
b = 2.
N = 100000
q = sample_Beta_Binomial(a, b, n, size=N)
h = np.zeros(n+1, dtype=np.float64) # histogram
for v in q: # fill it
    h[v] += 1.0
h /= np.float64(N) # normalization
print(h)

打印直方图

[0.03752 0.07096 0.09314 0.1114  0.12286 0.12569 0.12254 0.1127  0.09548 0.06967 0.03804]

在beta-binomial

上的Wiki页面中非常相似

最新更新