【问题标题】:Sample random variates from a Normal Inverse Gaussian (NIG) distribution来自正态逆高斯 (NIG) 分布的随机变量样本
【发布时间】:2021-07-15 08:18:27
【问题描述】:

如何从正态逆高斯 (NIG) 分布中采样随机变量?

我需要从 NIG 分布中生成 100 个数字。

我使用 boost::math::inverse_gaussian 但它没有像 std::normal_distribution 这样的 operator() 成员函数

编辑:Hörmann, W., Leydold 一直在对这个主题进行一些研究:

  1. 论文 Hörmann, W., Leydold, J. 生成广义逆高斯随机变量。统计计算机 24, 547–557 (2014)。 https://doi.org/10.1007/s11222-013-9387-3[https://doi.org/10.1007/s11222-013-9387-3][3]
  2. 幻灯片UNU.RAN
  3. C 中的实现Universal Non-Uniform RANdom number generators

【问题讨论】:

  • 参见here:“非成员访问器 - 支持所有发行版通用的所有常用非成员访问器函数:...”
  • @463035818_is_not_a_number 你能把这个拼写给我听吗?我想从 nig 分布boost docs 中为非成员函数获取 100 个数字。
  • 我需要 MC 模拟来对它们进行采样吗?
  • 看起来en.wikipedia.org/wiki/Inverse_Gaussian_distribution 有一个关于采样的部分,它给出了一个简单的算法。

标签: c++ math boost probability distribution


【解决方案1】:

我在Boost.Random 中找不到逆高斯分布。

您可以使用所谓的inverse transform sampling 技术。也就是说,你取逆高斯分布的逆 cdf(即分位数函数),并将其应用于 (0,1) 中的均匀随机数样本。

类似的东西:

boost::math::inverse_gaussian my_ig(2, 3);
double inverseCDFig(double p){
  return boost::math::quantile(my_ig, p);
}

然后,您使用std::uniform_real_distribution 生成介于 0 和 1 之间的均匀随机数,例如 u[i] 对应 i = 0; i < N,然后您计算每个 inverseCDFig(u[i]) 对应的 i。这样你就可以从逆高斯分布中得到一个随机样本。

【讨论】:

    最近更新 更多