\( \def\vector#1{\boldsymbol{#1}} \)

ベータ関数

Takami Torao
  • このエントリーをはてなブックマークに追加

定義と性質

ベータ関数 (beta function) は以下の積分で定義される特殊関数。\[ B(x, y) = B(y, x) = \int_0^1 t^{x-1} (1-t)^{y-1} dt \] またガンマ関数を使用して以下のように表すこともできる。\[ \begin{equation} B(x, y) = \frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)} \label{beta_expressed_gamma} \end{equation} \] したがって \(x\) と \(y\) が正の整数であれば階乗として表すことができる。\[ B(x, y) = \frac{(x-1)! (y-1)! }{(x+y-1)!} \]

不完全ベータ関数

不完全ベータ関数 (incomplete beta function) はベータ関数を一般化し \(0 \leq z \leq 1\) の範囲で不定積分とした関数である。\[ B_z(x, y) = \int_0^z t^{x-1} (1-t)^{y-1} dt \]

正則ベータ関数 (regularized beta function) \[ I_z(x, y) = \frac{B_z(x, y)}{B(x, y)} = \frac{1}{B(x, y)} \int_0^z t^{x-1} (1-t)^{y-1} dt \] ここで \(I_0(x, y) = 0\), \(I_1(x, y) = 1\) の制約。対象関係 \(I_z(x, y) = 1 - I_{1-z}(b, a)\)

もし \(x\) と \(y\) がともに 1 より大きい場合は

アルゴリズム

ベータ関数の実装

ベータ関数は式 (\(\ref{beta_expressed_gamma}\)) を用いて対数ガンマ関数を用いて算出することができる。ガンマ関数は分数で打ち消し合うため小さな \(x\), \(y\) に対して発散することはなく対数ベータ関数を用意する必要はない。

def beta(x:Double, y:Double):Double = {
  math.exp(gammaln(x) + gammaln(y) - gammaln(x + y))
}

Scala の REPL での実行結果は以下の通り。



不完全ガンマ関数の実装

不完全ガンマ関数は級数展開が可能である。\[ I_z(x, y) = \frac{z^x (1-z)^y}{x B(a, y)} \left\{ 1 + \sum_{n=0}^{\infty} \frac{B(x + 1, n + 1)}{B(x + y, n + 1)} z^{n+1} \right\} \]

def betai(z:Double)(x:Double, y:Double):Double = {
  if(z < 0.0 || z > 1.0){
    throw new IllegalArgumentException()
  }

  val bt = if(x == 0.0 || x == 1.0) 0.0 else {
    math.exp(gammaln(x + y) - gammaln(x) - gammaln(y) + x * math.log(z) + y * math.log(1.0 - z))
  }
  if(z < (x + 1.0) / (x + y + 2.0)){
    bt * beta
  }
}

scala>