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Γ ( 일)∫∞0로그( x ) 전자− x / c( x / c )디− 1디x = ( b − 1 ) Γ'( d)Γ ( 일)+ ( b − 1 ) 로그( c ) .
앞의 수확량에 연결
나는( a , b , c , d) = − c dㅏ− 로그(비Γ(b))+(b−1)Γ′(d)Γ(d)+(b−1)log(c).
간 KL 발산 와 Γ ( , B는 ) 동일 I ( C , D , C , D ) - I ( , B , C , D ) 조립이 간단하다.Γ(c,d)Γ ( a , b )나는( c , d, c , d) − I( a , b , c , d)
구현 세부 사항
감마 함수는 빠르게 증가하므로 오버플로를 피하기 위해 감마를 계산하지 말고 로그를 취하십시오. 대신 통계 컴퓨팅 플랫폼 (Excel 포함)에서 찾을 수있는 log-Gamma 함수를 사용하십시오.
비 의 로그 도함수이다 Γ , 일반적으로 불리는 ψ , digamma의 기능. 사용할 수없는 경우 Wikipedia 기사에 설명 된대로 대략적으로 간단한 방법이 있습니다.Γ'( d) / Γ ( d)Γ ,ψ,
여기서 설명하기 위해 I의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)