ガンマ関数は、統計学や機械学習の基本的な関数で、その登場回数は非常に多いです。
一方、ガンマ関数自体は、ベイズ推定などのあくまでも正規化項の一部として扱われることが多く、その関数系や定義については意外と理解されていないところもあるようです。
今回は、機械学習のテキストや実務で非常に多く登場するガンマ分布について、その定義や性質について理解を深めていきます。
- ガンマ関数の関数系を理解する
- ガンマ関数の性質を理解する
- Pythonでガンマ関数を可視化して、関数の形について理解する
ガンマ関数の定義
まず、最初にガンマ関数の定義を紹介します。ガンマ関数はこのように定義される連続関数になります。
正の実数$s$を用い下記のように、ガンマ関数を定義する。
\begin{equation} \begin{split} \Gamma(x) = \int_0^{\infin} x^{s-1} e^{-x} dx \end{split} \end{equation}
あとのセクションで可視化していくので、どのような関数形になっているかはその際に確認していきます。
ガンマ関数の性質
ガンマ関数を可視化する前に、ガンマ関数の性質について説明します。これは非常に重要です。
まず、ガンマ関数において成り立つのは、下記の性質です。$n$を整数とした時、
$n$を整数とした時、下記の性質が成り立つ。
\begin{equation} \begin{split} \Gamma(n + 1) = n! \end{split} \end{equation}
つまり、(1)式の$x$に $n+ 1$を代入した値が、(2)式になるということです。少し面白い性質ですね。
また、正の実数$x$についてもガンマ関数は下記の性質が成り立ちます。
正の実数$x$についてもガンマ関数は下記の性質が成り立ちます。
\begin{equation} \begin{split} \Gamma(x + 1) = x \Gamma(x ) \end{split} \end{equation}
ガンマ関数の性質として(3)式は非常に重要です。確率統計の分野では、ガンマ関数を用いた式変形をする際には、確実に登場します。この式から次の性質も導くことができます。
$\alpha$を非負の整数とした時、
\begin{equation} \begin{split} \Gamma(x + \alpha) = (x -1 + \alpha) \Gamma(x - 1 + \alpha) \end{split} \end{equation}
単純に、(3)式の$x$を$x + \alpha$に置き換えた形式となっています。
(3)の性質は、ベイズ推定における、共役事前分布の導出などにも登場するため、非常に登場頻度の高いガンマ関数の性質になります。
ベイズ推定や共役事前分布に関しては、下記のリンクを参考にしてください。

ガンマ関数を可視化する
ガンマ関数を可視化して、どのような関数形になっているか可視化してみましょう。
まずはライブラリをインストールします。
import numpy as np
from scipy.special import gamma
import matplotlib.pyplot as plt
下記のコードで可視化できます。np.linspace 関数の第三引数に2251を渡しているのは、公式ドキュメントでもそのようにしているからで、これが2251にしないと図が綺麗に表示されません。
x = np.linspace(-5, 5, 2251) # see: https://scipy.github.io/devdocs/reference/generated/scipy.special.gamma.html
fig = plt.figure(figsize = (8, 5))
ax = fig.add_subplot(111)
plt.axvline(x = -1, color = "gray", linestyle='dashed')
plt.axvline(x = 0, color = "gray", linestyle='dashed')
plt.axvline(x = -2, color = "gray", linestyle='dashed')
plt.axvline(x = -3, color = "gray", linestyle='dashed')
plt.axhline(y = 0, color = "gray", linestyle='dashed')
ax.set_xlim(-3.5, 5)
ax.set_ylim(-10, 25)
ax.plot(x, gamma(x), color='blue')
plt.show()

ガンマ関数を表示することができました。