ベータ関数を組み合わせで表現する|Python
ベータ関数は確率論・統計学で頻繁に登場する特殊関数だ。ベータ分布の正規化定数として現れ、ベイズ統計の共役事前分布でも重要な役割を果たす。Python の標準ライブラリにはベータ関数がないが、ガンマ関数と組み合わせを使って計算できる。
ベータ関数の定義
ベータ関数 は次の積分で定義される。
この積分は , で収束する。
ガンマ関数との関係
ベータ関数はガンマ関数で表現できる。
この関係式を使って Python で実装する。
import math
def beta(a, b):
"""ベータ関数 B(a, b) を計算"""
return math.gamma(a) * math.gamma(b) / math.gamma(a + b)
print(beta(2, 3)) # 0.08333333333333333(= 1/12)
print(beta(1, 1)) # 1.0
print(beta(0.5, 0.5)) # 3.141592653589793(= π)という美しい結果が得られる。これはガンマ関数の性質 から導かれる。
対数ベータ関数
大きな引数ではオーバーフローを避けるため、対数ベータ関数を使う。
import math
def log_beta(a, b):
"""対数ベータ関数 ln B(a, b) を計算"""
return math.lgamma(a) + math.lgamma(b) - math.lgamma(a + b)
# 大きな値でもオーバーフローしない
print(log_beta(100, 200)) # -202.43614612888504
print(log_beta(1000, 2000)) # -2079.9413946292893
# 元の値が必要なら指数を取る
print(math.exp(log_beta(2, 3))) # 0.08333333333333331組み合わせとの関係
ベータ関数は二項係数(組み合わせ)とも関係がある。
整数の場合、次の関係が成り立つ。
import math
def beta_from_comb(m, n):
"""組み合わせを使ってベータ関数を計算(整数のみ)"""
return 1 / (n * math.comb(m + n - 1, m))
# ガンマ関数版と比較
print(beta(3, 4)) # 0.016666666666666666
print(beta_from_comb(3, 4)) # 0.016666666666666666(一致)ベータ関数の対称性
ベータ関数は引数を入れ替えても値が変わらない。
print(beta(2, 5)) # 0.03333333333333333
print(beta(5, 2)) # 0.03333333333333333(一致)積分の定義から、 と変数変換すれば対称性が示せる。
漸化式
ベータ関数は次の漸化式を満たす。
a, b = 5, 3
# 漸化式の確認
lhs = beta(a, b)
rhs = (a - 1) / (a + b - 1) * beta(a - 1, b)
print(f'{lhs:.10f}') # 0.0119047619
print(f'{rhs:.10f}') # 0.0119047619(一致)応用例:ベータ分布の確率密度関数
ベータ分布 の確率密度関数は次のように定義される。
ベータ関数が正規化定数として現れる。
import math
def beta_pdf(x, alpha, beta_param):
"""ベータ分布の確率密度関数"""
if x <= 0 or x >= 1:
return 0
numerator = x**(alpha - 1) * (1 - x)**(beta_param - 1)
denominator = beta(alpha, beta_param)
return numerator / denominator
# Beta(2, 5) の x = 0.3 での密度
print(beta_pdf(0.3, 2, 5)) # 2.016840000000001ベイズ統計では、ベータ分布は二項分布の共役事前分布として使われる。
応用例:不完全ベータ関数と累積分布
不完全ベータ関数 は積分の上限を に制限したもので、ベータ分布の累積分布関数に相当する。標準ライブラリにはないが、SciPy で計算できる。
from scipy.special import betainc
# 正則化不完全ベータ関数 I_x(a, b) = B_x(a, b) / B(a, b)
# これはベータ分布の累積分布関数と同じ
alpha, beta_param = 2, 5
# P(X ≤ 0.3) を計算
print(betainc(alpha, beta_param, 0.3)) # 0.58014800000000006完全ベータ関数 B(a, b)
から までの積分。正規化定数として使う。
不完全ベータ関数
から までの積分。累積分布関数の計算に使う。
SciPy のベータ関数
SciPy には専用の関数が用意されている。
from scipy.special import beta as sp_beta, betaln
# ベータ関数
print(sp_beta(2, 3)) # 0.08333333333333333
# 対数ベータ関数
print(betaln(100, 200)) # -202.43614612888506大量の計算が必要な場合や、数値的な安定性が重要な場合は SciPy を使うとよい。











