基于修正的伯努利分布生成整数序列
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 中实现这个数字选择过程。
解决此类问题的通用方法是:
- 计算每个整数的
p^k * (1-p)
- 在 table
t
中创建这些的累积总和。
- 从
range(t)
的均匀分布中抽取一个数
- 测量该数字落入
t
的范围并检查对应的整数。
- 整数的概率越大,它覆盖的范围就越大。
这是快速而粗略的示例代码:
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
] 中选择一个整数:
- 在区间[0,
k
]中选择一个均匀的随机整数i
。
- 概率
weights[i]/max
(在您的情况下 weights[i] = p^i * (1-p)
),return i
。否则,转到步骤 1。
给定每个项目的权重,除了拒绝抽样或者Sirius的答案中的解决方案之外,还有很多其他方式可以进行加权选择;看看我的 note on weighted choice algorithms.
我想使用 R 随机生成一个整数序列,每个整数都是从整数池 (0,1,2,3....,k) 中挑选出来并进行替换的。 k是预先确定的。 (0,1,2,3....,k) 中每个整数 k 的选择概率是 pk(1-p) 其中 p 是预先确定的。也就是说,与 k 相比,1 有更高的概率被选中,而我的最终整数序列可能有比 k 多的 1。我不确定如何在 R 中实现这个数字选择过程。
解决此类问题的通用方法是:
- 计算每个整数的
p^k * (1-p)
- 在 table
t
中创建这些的累积总和。 - 从
range(t)
的均匀分布中抽取一个数
- 测量该数字落入
t
的范围并检查对应的整数。 - 整数的概率越大,它覆盖的范围就越大。
这是快速而粗略的示例代码:
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
] 中选择一个整数:
- 在区间[0,
k
]中选择一个均匀的随机整数i
。 - 概率
weights[i]/max
(在您的情况下weights[i] = p^i * (1-p)
),returni
。否则,转到步骤 1。
给定每个项目的权重,除了拒绝抽样或者Sirius的答案中的解决方案之外,还有很多其他方式可以进行加权选择;看看我的 note on weighted choice algorithms.