有没有办法在不计算 CDF 的情况下从非标准分布生成随机变量

Is there a way to generate a random variate from a non-standard distribution without computing CDF?

本文关键字:分布 非标准 变量 随机 情况下 CDF 计算 有没有      更新时间:2023-10-16

我正在尝试编写蒙特卡罗模拟。在我的模拟中,我需要从离散概率分布生成许多随机变量。

我确实有一个用于分布的封闭式解决方案,并且它具有有限的支持;但是,它不是标准分布。我知道我可以绘制一个均匀[0,1)随机变量并将其与CDF进行比较,从我的分布中获得随机变量,但是分布中的参数总是在变化。使用此方法太慢。

所以我想我的问题分为两部分:

  1. 是否有一种方法/算法可以在不使用 CDF 的情况下快速生成有限的离散随机变量?

  2. 是否有已经具有此功能的 Python 模块和/或C++库?

接受\拒绝:找到一个始终高于 pdf 的函数。生成 2 个随机变量。第一个用于缩放以计算值,第二个用于决定是接受还是拒绝选择。冲洗并重复,直到接受一个值。对不起,我不能更具体,但我有一段时间没有这样做了。这是一个标准算法,但我个人会从头开始实现它,所以我不知道有任何实现。

事实上,

如果你分析地了解你的pdf,接受/拒绝是要走的路。我们称之为f(x)。找到一个pdf g(x),使得存在一个常量c,使得c.g(x)>f(x),并且你知道如何用pdf g(x)模拟变量 - 例如,当你使用有限支持的分布时,一个均匀的将做:g(x)= 1/(你的域的大小)在域上。

然后画一对 (G, U),使得 G 用 pdf g(x) 模拟,U 在 [0, c.g(G)] 上是均匀的。然后,如果 U

请注意,常数 c 决定了方法的效率。c越小,效率越高 - 基本上平均需要c图纸才能获得正确的变量。最好得到一个足够简单的函数 g(不要忘记你需要使用 g 作为 pdf 绘制变量),但会尽可能小的 c。

如果接受拒绝也太低效,你也可以尝试一些马尔可夫链 MC 方法,它们生成一个样本序列,每个样本都依赖于前一个样本,因此通过跳过它们的块,可以子样本获得或多或少的独立集合。他们只需要PDF,甚至只需要它的倍数。通常它们使用固定分布,但也可以适应缓慢变化的分布。

相关文章: