Дивергенція KL - це різниця інтегралів форми
$$ \ eqalign {I (a, b, c, d) & = \ int_0 ^ {\ infty} \ log \ зліва (\ frac {e ^ {- x / a} x ^ {b-1}} {a ^ b \ Gamma (b)} \ справа) \ 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).
Підключення до попередніх урожаїв
I(a,b,c,d)=−cda−log(abΓ(b))+(b−1)Γ′(d)Γ(d)+(b−1)log(c).
Дивергенція KL між та Γ ( a , b ) дорівнює I ( c , d , c , d ) - I ( a , b , c , d ) , яку легко зібрати.Γ(c,d)Γ(a,b)I(c,d,c,d)−I(a,b,c,d)
Деталі впровадження
Гамма-функції швидко зростають, щоб уникнути переповнення, не обчислюйте Гамму та не приймайте її логарифм: замість цього використовуйте функцію log-Gamma, яку можна знайти в будь-якій статистичній обчислювальній платформі (включаючи Excel, для цього питання).
Ставлення є логарифмічна похідна Г , як правило , називають ψ , дігамма функція. Якщо це недоступно для вас, існують порівняно прості способи його наближення, як описано у статті Вікіпедії .Γ′(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)