C++ 中逆不完全 Beta 函数的快速实现

WWG*_*sDo 5 c++ math statistics

我正在寻找逆不完全 Beta 函数的实现,可能已经用 C++ 编写或易于自己实现。但是,我需要它快!例如,我将在优化器的内部循环中运行它,因此希望它需要几百个时钟周期。

这里已经有几个线程,但在这种情况下,我愿意为了速度而放弃很多准确性。另外,域受到一定限制,因为我只使用 a 和 b 的整数值。

有关该问题的更多背景信息:我给出了整数次试验 n 以及这些试验中成功的整数 k <= n 。我假设成功试验的潜在概率的背景分布在 [0,1] 中是均匀的,因此考虑到我已经看到了一些试验和成功,我的后验分布应该是 beta 分布。在贝叶斯模型中,我本质上是试图找到可能的潜在概率的第 p 个百分位数。

再说一遍,我不需要非常准确,只要快就可以了。我可以处理最多 +/- 1% 的误差。然而,对于小数字来说,它不可能非常不准确:我的输入范围从接近零到数万。

提前致谢!如果需要任何澄清,请告诉我。

Joh*_*erg 5

一种方法是制作一张桌子。如果需要区分,则需要对其进行插值。如果您将除一个参数之外的所有参数保持固定,这可能只是您的一种选择,但我认为您会这样做?(OP说不)

您可能希望使表格分箱非线性,以便按照您的要求在低 x 下获得良好的精度。尝试 bin 大小与 x、x^2 等成正比。

2. 使用简单的搜索方法(例如http://en.wikipedia.org/wiki/Secant_method)来查找作为(非逆)不完全 beta 函数的幂展开函数的值。http://en.wikipedia.org/wiki/Beta_function#Incomplete_beta_function。仅当它是单调的时才有效。

  1. 首先确保您确实需要制定自己的方法。也许先尝试这些? http://www.boost.org/doc/libs/1_35_0/libs/math/doc/sf_and_dist/html/math_toolkit/special/sf_beta/ibeta_inv_function.html