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)。