基于修正的伯努利分布生成整数序列

Generating Integer Sequences based on a Modified Bernoulli Distribution

我想使用 R 随机生成一个整数序列,每个整数都是从整数池 (0,1,2,3....,k) 中挑选出来并进行替换的。 k是预先确定的。 (0,1,2,3....,k) 中每个整数 k 的选择概率是 pk(1-p) 其中 p 是预先确定的。也就是说,与 k 相比,1 有更高的概率被选中,而我的最终整数序列可能有比 k 多的 1。我不确定如何在 R 中实现这个数字选择过程。

解决此类问题的通用方法是:

  1. 计算每个整数的p^k * (1-p)
  2. 在 table t 中创建这些的累积总和。
  3. range(t)
  4. 的均匀分布中抽取一个数
  5. 测量该数字落入 t 的范围并检查对应的整数。
  6. 整数的概率越大,它覆盖的范围就越大。

这是快速而粗略的示例代码:

draw <- function(n=1, k, p) {
    v <- seq( 0, k )
    pr <- (p ** v) * (1-p)
    t <- cumsum(pr)
    r <- range(t)
    x <- runif( n, min=min(r), max=max(r) )
    f <- findInterval( x, vec=t )
    v[ f+1 ] ## first interval is 0, and it will likely never pass highest interval
}

请注意,建议的解决方案不关心您的密度函数加起来是否为 1。根据您的描述,在现实生活中它可能会。但这对于解决方案并不重要。

天狼星的回答很好。但据我所知,你所描述的是截断的 geometric distribution.

我要注意几何分布在不同的作品中定义不同(例如参见MathWorld),因此我们使用如下定义的分布:

  • P(X = x) ~ p^x * (1 - p),其中x是[0, k]中的整数。

我对 R 不是很熟悉,但解决方案涉及调用 rgeom(1, 1 - p) 直到结果为 k 或更小。

或者,您可以使用通用拒绝采样器,因为概率是已知的(这里最好称为权重,因为它们的总和不需要为 1)。拒绝抽样说明如下:

假设每个权重为 0 或更大。将权重存储在列表中。计算最高权重,称其为max。然后,使用拒绝采样在区间 [0, k] 中选择一个整数:

  1. 在区间[0,k]中选择一个均匀的随机整数i
  2. 概率 weights[i]/max(在您的情况下 weights[i] = p^i * (1-p)),return i。否则,转到步骤 1。

给定每个项目的权重,除了拒绝抽样或者Sirius的答案中的解决方案之外,还有很多其他方式可以进行加权选择;看看我的 note on weighted choice algorithms.