快速不完全伽马函数

时间:2014-06-27 21:06:12

标签: statistics numerical gamma-function

在C ++中计算incomplete gamma function或至少是“良好”近似值的快速方法是什么?

背景

我最终需要计算什么

考虑到伯努利的一些小径N,成功概率为p,我最终试图计算获得最多k次成功的概率,作为k的函数。累积二项分布F(k,N,p)给出了这个概率。

对速度的需求

我需要计算每秒几十万这些累积概率。通过直接求和来计算累积二项分布对于大N来说是非常计算密集的。使用不完全β函数要好得多,但仍然是计算密集型。

可利用的约束

我希望应用程序域中的以下约束可以帮助加快计算速度:

  • p< 0.01(分布总是非常偏斜)
  • N> 50

泊松近似

在Excel中进行了一些实验后,我了解到在上述条件下泊松近似是非常好的。即在感兴趣的条件下,k处的B(N,p)与k处的Pois(Np)几乎相同。这意味着我只需要2个变量的函数,不再是3个。

据我所知,累积泊松分布可以根据不完整的伽马函数来计算,根据cephes库中的源代码判断,计算起来比原始的不完全β函数要简单得多。必须在没有泊松近似的情况下进行计算。但它仍然不是很简单,而是一个迭代的数值计算。所以现在我正在寻找一种快速计算不完整伽玛函数的方法。我想知道是否有一个封闭形式的表达式可以合理地近似它。

所需精度

20%的相对误差在积分/概率上是完全可以接受的(从每个k,两个方向考虑)。

我已经考虑过直接使用Poisson CDF的插值查找表,但是均匀间隔的域点可能不太理想,然后域也必须被限制为任意矩形。我希望找到一个具有相当多调整参数的分析函数。

1 个答案:

答案 0 :(得分:0)

我没有使用Gamma函数,而是编造了这种将泊松变量转换为标准正态变量的近似值:

float poisson_z(float x, float mu){
    static const float twoThirds = 2.0f/3.0f;
    float w = sqrt((x+0.5f)/mu) - 1.0f;
    float coeff = w>=0.0f ? 0.085f : 0.15f;
    return (x-mu+twoThirds)/sqrtf(mu*(1.0f+w*(0.68f+w*coeff)));
}

标准正态分布的近似值并不缺乏。