KL発散は、次の形式の積分の差です。
$$ \ eqalign {I(a、b、c、d)&= \ int_0 ^ {\ infty} \ log \ left(\ frac {e ^ {-x / a} x ^ {b-1}} {a ^ b \ Gamma(b)} \ right)\ frac {e ^ {-x / c} x ^ {d-1}} {c ^ d \ Gamma(d)} dx \
&=-\ frac {1} {a} \ int_0 ^ \ infty \ frac {x ^ de ^ {-x / c}} {c ^ d \ Gamma(d)} \、dx-\ log(a ^ b \ Gamma(b))\ int_0 ^ \ infty \ frac {e ^ {-x / c} x ^ {d-1}} {c ^ d \ Gamma(d)} \、dx \&\ quad +(b- 1)\ int_0 ^ \ infty \ log(x)\ frac {e ^ {-x / c} x ^ {d-1}} {c ^ d \ Gamma(d)} \、dx \
&=-\ frac {cd} {a}-\ log(a ^ b \ Gamma(b))+(b-1)\ int_0 ^ \ infty \ log(x)\ frac {e ^ {-x / c } x ^ {d-1}} {c ^ d \ Gamma(d)} \、dx} $$
私たちはただ観察することによって得られる右手積分を取り扱わなければなりません
∂∂dΓ(d)====∂∂d∫∞0e−x/cxd−1cddx∂∂d∫∞0e−x/c(x/c)d−1cdx∫∞0e−x/cxd−1cdlogxcdx∫∞0log(x)e−x/cxd−1cddx−log(c)Γ(d).
ホセ
b−1Γ(d)∫∞0log(x)e−x/c(x/c)d−1dx=(b−1)Γ′(d)Γ(d)+(b−1)log(c).
前述のyieldにプラグインする
I(a,b,c,d)=−cda−log(abΓ(b))+(b−1)Γ′(d)Γ(d)+(b−1)log(c).
とΓ (a 、b )の間のKL発散はI (c 、d 、c 、d )− I (a 、b 、c 、d )に等しく、組み立てが簡単です。Γ(c,d)Γ(a,b)I(c,d,c,d)−I(a,b,c,d)
実装の詳細
ガンマ関数は急速に成長するため、オーバーフローを回避するためにガンマを計算せずに対数を取ります。代わりに、統計計算プラットフォーム(Excelを含む)にあるlog-Gamma関数を使用します。
比の対数微分であるΓ 、一般的に呼ばれるψ 、ディガンマ関数。入手できない場合は、Wikipediaの記事で説明されているように、比較的簡単に概算できます。Γ′(d)/Γ(d)Γ,ψ,
ここで、説明のR
ために、観点から式を直接実装します。これは、結果を代数的に単純化する機会を活用しません。これにより、(ψの冗長な計算を排除することで)少し効率が向上します。Iψ
#
# `b` and `d` are Gamma shape parameters and
# `a` and `c` are scale parameters.
# (All, therefore, must be positive.)
#
KL.gamma <- function(a,b,c,d) {
i <- function(a,b,c,d)
- c * d / a - b * log(a) - lgamma(b) + (b-1)*(psigamma(d) + log(c))
i(c,d,c,d) - i(a,b,c,d)
}
print(KL.gamma(1/114186.3, 202, 1/119237.3, 195), digits=12)