从多项式和狄利克雷分布中寻找采样的 C/C++ 实现

计算科学 随机数生成 统计数据
2021-12-10 14:11:20

我正在寻找返回随机变量多项式和狄利克雷分布的函数的 C/C++ 实现。这是在计算后验预测 p 值的背景下,其中一部分包括 MCMC 步骤。我一直在使用 Python,但出于速度原因,我正在用 C++ 重写我的部分代码。到目前为止,我一直在使用 numpy.random 的实现。

我目前的选择包括

  1. 从 numpy.random 中提取实现,这些实现很可能是用 C 编写的。

  2. 使用这些函数的 R 版本,这些函数在 Debian 的 r -mathlib库中很方便。长期以来,这个库一直是我对此类事情的默认选择,因为 R 人在概率计算方面了解他们的知识。

但是,我愿意接受这些功能的其他版本。建议?

编辑: r-mathlib 似乎没有从 Dirichet 分布中采样的功能,尽管根据Wikipedia 关于 Dirichlet 分布的条目,我可以对 Gamma 变量求和。我想知道这是否是这样做的好方法。

EDIT2:如果可能,请评论为什么您认为您建议的实施是一个不错的选择。

2个回答

我会推荐GNU 科学图书馆 (GSL)

GSL 分别具有Dirichlet 分布gsl_ran_dirichletgsl_ran_multinomial多项分布。请参阅此处的 Dirichlet 分布手册和此处的多项分布手册页完整的文档可以在这里找到,也可以在这里在线找到

之所以选择以下是因为它不依赖额外的库。因此,这使得支持多个目标(例如 arm 或 blackfin 处理器)变得更加容易,并减少了依赖性和 ABI 麻烦。

多项式

里面有<random>一个类:

template <class IntType = int> class discrete_distribution;

离散分布这个词实际上是不正确的,但我们不能指望 STL 程序员是统计专家。:-)

所以,这是一个没有前面的多项分布1/B(x)因素。

f(x)=ipixi

该类接受值wi这将被归一化,这样它们就形成了一个实际的概率ipi=1. 在很多情况下都很方便。

狄利克雷

我还没有找到 Dirichlet 发行版的头文件。然而,狄利克雷的形式是:

f(x)=1B(α)ixiαi1

因此,您可能想检查是否也可以使用上述类。如其中一条评论所示。如果 Dirichlet 用作多项分布的先验,则后验有可用的封闭形式。