如何从任意平滑分布中进行数字采样?

计算科学 蒙特卡洛 可能性
2021-11-24 21:36:09

通过合理精细网格上的值,我得到了一个平滑的概率密度函数。我假设三次样条插值(或密度对数的三次样条插值)足以在任意点以高精度对其进行评估。我想知道如何生成重现此分布的随机数。

我的第一枪是用分段线性函数来近似这个分布的累积分布函数F(在原始网格上),画一个数字r[0,1)均匀随机,取xF(x)=r. 但是,我注意到我的最终结果的准确性不是很高,并且我怀疑我失去了准确性,因为我的数值随机变量的分段常数概率密度不能很好地逼近真实的平滑概率密度函数。我有什么选择?

以下是我的一些想法:

  1. 去图书馆找一本关于蒙特卡洛模拟的书。或者尝试请教专家。
  2. 对三次样条进行解析积分,得到分段四次函数F. 仍然会有一个解析公式xF(x)=r,但实施起来可能很复杂,评估起来也很慢。
  3. 用分段线性函数逼近平滑概率密度函数,给出分段二次函数F. 的解析公式xF(x)=r应该易于实施并且可以合理快速地进行评估。
  4. 用分段线性函数逼近平滑概率密度函数的对数,给出分段“简单”解析函数F. 的解析公式xF(x)=r应该易于实施并且可以合理快速地进行评估。
  5. 近似平滑概率密度函数g通过分段常数函数f这样g1.1f. 现在通过第一次抽样使用拒绝抽样x通过F(x)=r1,然后拒绝x如果g(x)<1.1f(x)r2.
  6. 近似F1(r)通过合适的分段分析函数。但是这里的合适是什么意思呢?
3个回答

如果您的 PDF 是有界的,您可以尝试使用高次多项式插值来近似其逆。这通常被认为是一件坏事,但这只是一个神话

需要记住的一些事项:

  • 代替使用等间距网格,在第一类切比雪夫节点处进行插值,即xi=cos(π2i12N), 为了F(x)定义在[,],或第二种,即xi=cos(πi1N1), 为了F(x)在有限区间上定义。

  • 如果F(x)在无限区间上,不要插值F1(r),因为它将在端点处具有奇点,但插值F1(r)/(r2r),因为这将抵消奇点r=0r=1. 使用第一类切比雪夫节点将避免评估F1(r)在这些奇异点上。

  • 您可以使用重心插值评估插值请注意,如果您评估F1(r)在第一类或第二类切比雪夫节点上,重心权重wj有闭式表达式。

  • 为了更快地进行向量化的评估,请使用类似Vandermonde的矩阵VVij=Tj(xi)计算一次插值的切比雪夫系数(如果您使用切比雪夫节点,V应该是条件良好的)并使用Clenshaw 的算法对其进行多次评估r一次。

这里描述的方法或多或少是Chebfun 系统所做的(免责声明:我曾经是 Chebfun 开发团队的一员)。Nick Trefethen 的《逼近理论与逼近实践》一书中描述了大部分基本的切比雪夫技术,其中前六章可在​​线获取。

我会选择你的选项3。

也就是说,如果您详细说明您的陈述“但是,我注意到我的最终结果的准确性不是很好”,那将会有所帮助。我这么说是因为如果定义 PDF 的网格足够好,那么我看不出你的方法不可行的理由。我要做的是尝试从您分析知道的 PDF 开始进行调试,比如说高斯,然后逐一评估您执行的步骤。例如,从一个非常精细的网格和分段常数近似开始——生成的样本集看起来还好吗?如果没有,使用分段线性近似是否会变得更好?如果不是,那么错误必须在其他地方。等等。

我现在已经解决了我的问题。我失去准确性的原因甚至没有出现在问题中。让我们首先从问题中解决提出的解决方案:

  1. 在这种情况下,尝试了解更多信息是个好主意。
  2. 当分析公式相当简单时,它们就很有吸引力。这不是这里的情况。
  3. 直截了当的线性插值听起来是个好主意,至少对于验证来说是这样。也许有一天我会实现它,它不会太难。另请参阅 Wolfgang Bangerth 的答案。
  4. 请注意。我做了一些相关的事情。我近似平滑概率密度函数f(x)通过形式的分段分析函数axb. 它的反衍生物ab+1xb+1具有相同的简单形式,并且时刻f(x)xndx也导致相同形式的积分。
  5. 拒绝方法不应该被彻底拒绝,但我没有尝试过这个。
  6. 近似F1(r)是“正确”的程序之一。合适在这里是什么意思?逆累积分布函数是单调递增的,在扩展范围内接近于零的概率密度转化为非常陡峭的斜率F1(r). 非均匀有理插值是能够处理这些特征的一种选择。非均匀网格导致O(logn)单个功能评估的努力,但这通常在实践中仍然足够快。另见佩德罗的回答。(但是,那O(n)使用 Chebyshev 插值而不是O(1)或者O(logn)过去的努力让我感到不安。)

但是隐含的“真实”问题呢?

但是,我注意到我的最终结果的准确性并不高,我怀疑我失去了准确性,因为......

实际上,我得到的不仅仅是一个概率密度函数,而是一个概率密度函数的一个参数族,在相对于一个参数的足够精细的网格上制表。我通过预先计算的逆累积分布函数之间的线性插值来处理这个问题。然而,即使概率密度函数通过列表概率密度函数之间的线性插值很好地近似,我的上述过程也可能导致不可接受的错误。

“正确”的解决方案要简单得多。它使用组合方法。首先随机抽取一个均匀的数字以在可用的预计算分布之间进行选择,然后从所选分布中采样值。这实际上会生成“完全正确”的分布,以防概率密度函数实际上是作为可用预计算分布的加权和给出的。