有没有一种方法可以从非标准分布生成随机变量而不计算CDF?

问题描述 投票:0回答:4

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

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

所以我想我的问题有两个部分:

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

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

c++ python algorithm random montecarlo
4个回答
0
投票

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


0
投票

如果您分析性地了解您的 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)]上均匀。那么,如果你< f(G), accept U as your variable. Otherwise draw again. The U you will finally accept will have f as a pdf.

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


0
投票

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


0
投票

在过去的几年里,SciPy 中添加了一些不错的新工具来解决此类问题。 只需指定 pdf,您就可以轻松地从具有有限支持的自定义离散分布生成样本。

不同方法的概述: https://docs.scipy.org/doc/scipy/reference/stats.sampling.html

对于离散分布,方法是

DiscreteAliasUrn
DiscreteGuideTable

教程: https://docs.scipy.org/doc/scipy/tutorial/stats/sampling.html

如果您的参数变化,通常会很复杂。在不了解具体问题的更多情况下,值得尝试上述方法之一。

© www.soinside.com 2019 - 2024. All rights reserved.