ポアソン分布に従う2つの確率分布のKLダイバージェンスの計算をメモとしてまとめました。
前提
2つの確率分布$p, q$はパラメータ$\lambda_p, \lambda_q$をそれぞれ持つポアソン分布に従っている。
$p$の確率密度関数は以下のように定義する。
$$p(x) = e^{-\lambda_p} \frac{\lambda_p^x}{x!}$$
また離散確率分布のKLダイバージェンスは以下のようになる。
$$D_{KL}(p, q) = \sum_{x=0}^{\infty} p(x) \log \frac{p(x)}{q(x)}$$
計算式
\begin{equation*}\begin{split}D_{KL}(p,q) &= \sum_{x=0}^{\infty} p(x) \log \frac{p(x)}{q(x)} \\&=\sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot \log \frac{e^{-\lambda_p} \frac{\lambda_p^x}{x!}}{e^{-\lambda_q} \frac{\lambda_q^x}{x!}} \\&=\sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot ( \log e^{-\lambda_p} \frac{\lambda_p^x}{x!} - \log e^{-\lambda_q} \frac{\lambda_q^x}{x!} )\\&=\sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot (-\lambda_p +\log \frac{\lambda_p^x}{x!} +\lambda_q - \log \frac{\lambda_q^x}{x!} )\\&=\sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot (\lambda_q -\lambda_p +\log \frac{\lambda_p^x}{x!} \frac{x!}{\lambda_q^x} )\\&=\sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot (\lambda_q -\lambda_p +\log \frac{\lambda_p^x}{\lambda_q^x} )\\&=\sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot (\lambda_q -\lambda_p) + \sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot \log \frac{\lambda_p^x}{\lambda_q^x} \\&=\lambda_q -\lambda_p + \sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^x}{x!} \cdot x \log \frac{\lambda_p}{\lambda_q} \\&=\lambda_q -\lambda_p + \sum_{x=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^{x-1}}{(x-1)!} \lambda_p \cdot \log \frac{\lambda_p}{\lambda_q}\\&=\lambda_q -\lambda_p + \sum_{t=0}^{\infty} e^{-\lambda_p} \frac{\lambda_p^{t}}{t!} \lambda_p \cdot \log \frac{\lambda_p}{\lambda_q} &\mbox{$t=x-1$とする}\\&=\lambda_q -\lambda_p + e^{-\lambda_p} e^{\lambda_p} \lambda_p \cdot \log \frac{\lambda_p}{\lambda_q} \\&=\lambda_q -\lambda_p + \lambda_p \cdot \log \frac{\lambda_p}{\lambda_q}\\\end{split}\end{equation*}
検証
scipyのpmf, entropyを利用したKLダイバージェンスの計算と上の数式での結果が等しくなるかどうか試した。
import numpy as np
from scipy.stats import poisson, entropy
x = np.linspace(0, 100, 101)
# パラメータλをalphaとして定義
alpha_p = 1
alpha_q = 5
p = poisson.pmf(x, alpha_p)
q = poisson.pmf(x, alpha_q)
kl = entropy(p, q)
# 上の式に基づいた計算
kl_alpha = alpha_q - alpha_p + alpha_p * np.log(alpha_p / alpha_q)
print("entropy関数を利用したKLダイバージェンス:", kl)
print("alphaを利用したKLダイバージェンス:", kl_alpha)
出力結果
entropy関数を利用したKLダイバージェンス: 2.3905620875658995
alphaを利用したKLダイバージェンス: 2.3905620875658995