高校国語788336 views
いろは3010814 views
高校化学2924392 views
英語613639 views
ヒストリア290598 views
中学英語811710 views
数学講師2886227 views
LaTeX962153 views
教育149510 views
中学理科1630641 views
Help
Tools
NewsSpreadsheetCalendarBookkeepingSlidesTier ListPen ToolIllustrationCrayonWatercolorPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchSwirl EffectOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksWater RippleWater SplashBreaking GlassWood GrainMarble TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsRolling DiceCross SectionsMotion PathMechanicsWavesElectromagnetic WavesLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHPeriodic TableComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseMuscle ContractionHormones and HomeostasisRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic TheoryShogi StrategyPiano Rhythm Game

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 を使うとよい。