题目
两个正态分布之间的KL散度(Kullback-Leibler Divergence)是一种衡量两个分布之间差异的指标,其计算公式为:
K
L
(
p
∣
∣
q
)
=
∫
p
(
x
)
log
p
(
x
)
q
(
x
)
d
x
KL(p||q) = \int p(x) \log \frac{p(x)}{q(x)} dx
KL(p∣∣q)=∫p(x)logq(x)p(x)dx
其中,
p
(
x
)
p(x)
p(x)和
q
(
x
)
q(x)
q(x)分别是两个正态分布的概率密度函数。
但是本题中,使用的计算公式是:
对于两个正态分布 p ( x ) = N ( μ p , σ p 2 ) p(x) = N(\mu_p, \sigma_p^2) p(x)=N(μp,σp2) 和 q ( x ) = N ( μ q , σ q 2 ) q(x) = N(\mu_q, \sigma_q^2) q(x)=N(μq,σq2),它们之间的KL散度可以表示为:
K L ( p ∣ ∣ q ) = ln σ q σ p + σ p 2 + ( μ p − μ q ) 2 2 σ q 2 − 1 2 KL(p||q) = \ln\frac{\sigma_q}{\sigma_p} + \frac{\sigma_p^2 + (\mu_p - \mu_q)^2}{2\sigma_q^2} - \frac{1}{2} KL(p∣∣q)=lnσpσq+2σq2σp2+(μp−μq)2−21
标准代码如下
def kl_divergence_normal(mu_p, sigma_p, mu_q, sigma_q):
term1 = np.log(sigma_q / sigma_p)
term2 = (sigma_p ** 2 + (mu_p - mu_q) ** 2) / (2 * sigma_q ** 2)
kl_div = term1 + term2 - 0.5
return kl_div