La divergence KL est une différence d'intégrales de la forme
$$ \ eqalign {I (a, b, c, d) & = \ int_0 ^ {\ infty} \ log \ left (\ frac {e ^ {- x / a} x ^ {b-1}} {a ^ b \ Gamma (b)} \ droite) \ 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} $$
Il suffit de traiter l'intégrale de droite, qui est obtenue en observant
∂∂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).
D'où
b−1Γ(d)∫∞0log(x)e−x/c(x/c)d−1dx=(b−1)Γ′(d)Γ(d)+(b−1)log(c).
Brancher sur les rendements précédents
I(a,b,c,d)=−cda−log(abΓ(b))+(b−1)Γ′(d)Γ(d)+(b−1)log(c).
La divergence KL entre et Γ ( a , b ) est égale à I ( c , d , c , d ) - I ( a , b , c , d ) , ce qui est simple à assembler.Γ(c,d)Γ(a,b)I(c,d,c,d)−I(a,b,c,d)
Détails d'implémentation
Les fonctions gamma se développent rapidement, donc pour éviter le débordement, ne calculez pas Gamma et ne prenez pas son logarithme: utilisez plutôt la fonction log-Gamma qui se trouvera dans n'importe quelle plate-forme de calcul statistique (y compris Excel, d'ailleurs).
Le rapport est la dérivée logarithmique de Γ , généralement appelée ψ , la fonction digamma . S'il n'est pas disponible, il existe des moyens relativement simples de l'approcher, comme décrit dans l'article Wikipedia .Γ′(d)/Γ(d)Γ,ψ,
Pour illustrer ce point , est directement R
mise en œuvre de la formule en termes de . Cela n'exploite pas une opportunité de simplifier algébriquement le résultat, ce qui le rendrait un peu plus efficace (en supprimant un calcul redondant de ψ ).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)