SciPy 中 Gamma 及其相关函数
本文解释了 SciPy 中 gamma 函数及其相关函数,这些函数有:
- gamma
- gammaln
- gammainc
- gamaincinv
- gammaincc
- gammainccinv
- beta
- betaln
- betainc
- betaincinv
- psi
- polygamma
SciPy 中的函数名很容易和数学函数相对应。但是,有以下几点要注意:
- 以
ln
结尾的函数的确是取自然对数,但它们要先取绝对值。 - 包含
inc
的函数计算的是 正则化 不完全函数(regularized incomplete functions),而不是简单的不完全函数。
这些要点将在下面阐明。
Gamma 和 beta 函数
在 SciPy 中 gamma 函数 $\Gamma (z)$
和 beta 函数 $B(x, y)$
毫不意外地被称为 gamma
和 beta
。gamma(z)
计算:
$$\Gamma (z) = \int_0^{\infty} t^{z-1}e^{-t} dt$$
beta(x, y)
计算:
$$B(x, y ) = \int_0^1 t^{x-1}(1-t)^{y-1}dt=\frac{\Gamma(x) \Gamma(y)}{\Gamma(x+y)}$$
对数
通常 gamma 和 beta 函数在实践中不如其对数形式有用(请参阅这里的解释)。这些对数形式在 SciPy 中被称为 gammaln
和 betaln
。 注意 gammaln
实际上返回的是 gamma 函数 绝对值 的自然对数,即 gammaln(z)
计算 $log|\Gamma(z)|$
。而 betaln(x, y)
计算 $log|B(x, y)|$
。
Psi 和 polygamma 函数
用 $\psi(z)$
表示 $log(\Gamma(z))$
的导数,在 SciPy 中被称为 psi
函数。$\psi(z)$
的第 n 个导数在 SciPy 中用 psi(n, z)
表示。
不完全函数与互补函数
gamma 和 beta 函数都有“不完全”版。但是,SciPy 的不完全伽马函数 gammainc
对应 正则化 伽玛函数。类似地,SciPy 的不完全 beta 函数 betainc
对应正则化 beta 函数。
(下)不完全 gamma 函数由下式定义
$$\gamma(a, z) = \int_0^z t^{a-1}e^{-t} dt$$
上不完全 gamma 函数由下式定义
$$\Gamma(a, z) = \int_z^{\infty} t^{a-1}e^{-t} dt$$
之所以被称为“不完全”是因为它们在 gamma 函数定义域的一部分进行积分。不完全 beta 函数也遵循同样的模式。
正则化的不完全 gamma 函数定义如下:
$$P(a, z) = \frac{\gamma(a, z)}{\Gamma(a)}$$
以及
$$Q(a, z) = \frac{\Gamma(a, z)}{\Gamma(a)}$$
SciPy 的函数 gammainc(a, z)
计算 P(a, z)
,函数 gammaincc
计算 Q(a, z)
。 注意 gammaincc
中额外的 c 代表“互补”。由于 Q(a, z) = 1 - P(a, z)
,所以似乎不需要同时提供 P(a, z)
及其互补函数 Q(a, z)
。但是,为了数值的精度,我们需要互补函数。请参阅这里的解释。这里同样适用于不完全伽马函数。
不完全 beta 函数定义为
$$B_x(a, b) = \int_0^x t^{a-1}(1-t)^{b-1} dt$$
正则化不完全 beta 函数定义为
$$I_x(a, b) = \frac{B_x(a, b)}{B(a, b)}$$
SciPy 函数 betainc(a, b, c)
计算 $I_x(a, b)$
反函数
以 inv
结尾的 SciPy 函数计算相应函数的反函数。gammaincinv(a, y)
返回使得 gammainc(a, x) = y
的 x
。同样的,gammainccinv
是 gammaincc
的反函数。 最后,betaincinv(a, b, y)
返回使得 betainc(a, b, x) = y
的 x
。
在 gamma 和 beta 函数的 SciPy 实现中存在不对称:没有 betaincc
或 betainccinv
函数。由于 beta 函数的对称性,这些函数是不必要的。可以将 betaincc(a, b, x)
定义为 betainc(b, a, 1-x)
,将 betainccinv(a, b, x)
定义为 betaincinv(b, a, 1-x)
。