高校国語785655 views
世界の国560595 views
MathPython491378 views
数学講師2852771 views
中学社会667106 views
高校日本史189857 views
小学理科717236 views
中学数学621382 views
中学理科1626207 views
小学社会308636 views
Help
Tools

English

ベータ関数を組み合わせで表現する|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 を使うとよい。