当前位置: 首页 > 知识库问答 >
问题:

如何对连续负二项分布进行高效采样?

章乐逸
2023-03-14

我想做的是利用我对连续负二项分布进行抽样的事实,这是得到头部所需要的试验数的分布,也就是说,如果f(X)是这个分布,那么f(X)给出了在我们遇到头部之前有X个尾部的概率,其中X不必是整数。如果我能对这个分布进行采样,那么我能做的就是,如果X是尾部的数量,那么我就能看到X是大于还是小于信用的数量;如果大于,那么我们用完所有的学分,但什么也没有发生,如果小于或等于,那么好事发生了,我们从学分的数目中减去X。此外,因为分布是连续的,我可以很容易地处理分数学分。

有没有人知道一种方法让我能够有效地对连续负二项分布(也就是从这个分布中产生随机数的函数)进行采样?

共有1个答案

汪飞捷
2023-03-14

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

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

负二项分布也可以近似为泊松分布的混合,但这并不能使你摆脱伽马函数的依赖关系。

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

编辑:

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

// 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
 类似资料:
  • 问题内容: 所以,我有一张表,上面有这样的行: 每次扫描警报时(即每次触发或清除警报时)都会添加“已扫描的警报”行。任何警报都会添加带有特定Ev_Custom1的行。第一列Ev_Message包含一个计算机ID,该ID使我可以将警报与其他计算机分开。(您不喜欢任意的列名吗?)超过900条独特的警报消息。 我希望查询返回的内容是这样的: 这将是两个日期之间过滤的查询。我可以更改进入表的数据,但是有9

  • 问题内容: 我有一个包含类别,日期和费率的表。每个类别在不同日期可以具有不同的费率,一个类别在给定日期只能具有一个费率。 唯一索引(类别,日期,费率)我希望针对每个类别将所有连续的日期范围归为一组,并仅保留范围的开始和结束。对于前面的示例,我们将有: 我在论坛中找到了一个类似的解决方案,但并未完全给出结果 请参见SQL FIDDLE 如何在mysql中做同样的事情?请帮忙! 问题答案: MySQL

  • 问题内容: 我如何返回在MySQL中实际上是“连续的” GROUP BY。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 采用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:

  • 问题内容: 我在DataFrame中有一列带有值: 如何将它们这样分组? 问题答案: 你可以groupby通过自定义使用:

  • 我们有一个web应用程序,帮助组织生物实验(用户描述实验和上传实验数据)。在主页中,我们展示了前10个实验,然后在上一个下一个1 2 3..30. 我虫子我如何使有效的总计数和分页。目前: 我想开发分页,总是执行相同的。记录计数不得影响分页或记录总数。

  • 问题内容: 如何返回在MySQL中实际上是“连续的” GROUP BY的内容。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 使用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案: