首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有效地对连续的负二项分布进行采样?

如何有效地对连续的负二项分布进行采样?
EN

Stack Overflow用户
提问于 2016-11-24 07:23:53
回答 1查看 354关注 0票数 1

首先,为了上下文,我正在做一个游戏,当你做一些好的事情时,你会获得正的信用,当你做了不好的事情,你会获得负的信用,每个信用对应于抛出一个有偏见的硬币,如果你得到正面,那么就会发生一些事情(如果是积极的信用,就是好的,如果是负的信用,就是坏的),否则什么都不会发生。

交易是,我想处理多个积分和部分积分的情况,我想让翻转用完积分,这样如果发生了一些好/坏的事情,剩余的积分就会继续。这样做的一种直接方法是执行一系列试验,特别是对于分数学分的情况,我们可以将学分的数量乘以X,将发生某事的可能性乘以1/X (分布具有相同的期望,但权重略有不同);不幸的是,这对用户可以获得的学分以及学分的数量中可以有多少小数位进行了实际限制,因为这会导致无限的工作量。

我想要做的是利用这样一个事实,我正在采样连续的负二项分布,这是获得正面所需的试验次数的分布,即,如果f(X)是分布,那么f(X)给出在我们遇到正面之前将有X个尾部的概率,其中X不需要是整数。如果我可以采样这个分布,那么我可以做的是,如果X是尾部的数量,那么我可以看到X是大于还是小于信用的数量;如果它大于,那么我们就会用完所有的信用,但什么也不会发生,如果它小于或等于,那么一些好的事情发生了,我们从信用的数量中减去X。此外,因为分布是连续的,我可以很容易地处理分数积分。

有没有人知道一种方法,可以有效地对连续的负二项分布(即,从该分布生成随机数的函数)进行采样?

EN

回答 1

Stack Overflow用户

发布于 2016-11-24 08:02:38

这个问题在StatsExchange上可能会得到更好的回答,但在这里我将尝试一下。

您是正确的,尝试直接计算这将是计算昂贵的,因为您无法避免beta和/或gamma函数依赖。我所知道的唯一在统计上有效的近似是,如果s所需的成功次数很大,而p既不是很小也不是很大,那么您可以用具有特殊均值和方差的正态分布来近似它。你可以阅读更多的here,但我猜这个近似值并不普遍适用于你。

负二项分布也可以近似为泊松分布的混合,但这并不能避免对gamma函数的依赖。

据我所知,唯一有效的负二项采样器使用优化的接受-拒绝技术。这个PDF here的第10-11页描述了该方法背后的概念。本here的第6页(内部第295页)包含使用相关技术对二项式偏差进行采样的源代码。请注意,即使是这些方法仍然需要随机的均匀偏差以及sqrt()log()gammln()调用。对于少量的试验(可能少于100次?)如果只是用快速随机数生成器模拟试验,甚至比接受-拒绝技术还要快,我一点也不会感到惊讶。首先一定要得到一个快速的PRNG;它们并不是生而平等的。

编辑:

只要p而不是非常大(太接近1.0),下面的伪代码可能会非常有效地绘制一个随机的离散负二项分布值。它将返回在达到您的第一个“期望”结果之前所需的试验次数(根据分布,这实际上是第一个“失败”):

代码语言:javascript
运行
复制
// assume p and r are the parameters to the neg. binomial dist.
// r = number of failures (you'll set to one for your purpose)
// p = probability of a "success"
double rnd = _rnd.nextDouble(); // [0.0, 1.0)
int k = 0;  // represents the # of successes that occur before 1st failure
double lastPmf = (1 - p)^r;
double cdf = lastPmf;
while (cdf < rnd)
{
    lastPmf *= (p * (k+r) / (k+1));
    cdf += lastPmf;
    k++;
}
return k;
// or return (k+1) to also count the trial on which the failure occurred

与在每个步骤中单独重复阶乘相比,使用递归关系可以节省时间。我认为使用它,再加上将小数精度限制在1位或2位小数(因此您只需要分别乘以10或100 )可能会达到您的目的。您只绘制了一个随机数,其余的只是乘法--它应该非常快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40775783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档