Python で kl ダイバージェンスを計算する方法 (例付き)
統計学において、カルバック・ライブラー (KL) 発散は、 2 つの確率分布間の差異を定量化する距離指標です。
2 つの確率分布 P と Q がある場合、一般に KL(P || Q) という表記を使用して KL 発散を書きます。これは、「Q からの P の発散」を意味します。
次の式を使用して計算します。
KL(P || Q) = ΣP(x) ln (P(x) / Q(x))
2 つの分布間の KL 発散がゼロの場合、これは分布が同一であることを示します。
scipy.special.rel_entr()関数を使用して、Python で 2 つの確率分布間の KL 発散を計算できます。
次の例は、この関数を実際に使用する方法を示しています。
例: Python での KL 発散の計算
Python に次の 2 つの確率分布があるとします。
注: 各分布の確率の合計が 1 になることが重要です。
#define two probability distributions
P = [.05, .1, .2, .05, .15, .25, .08, .12]
Q = [.3, .1, .2, .1, .1, .02, .08, .1]
次のコードを使用して、2 つの分布間の KL 発散を計算できます。
from scipy. special import rel_entr
#calculate (P || Q)
sum(rel_entr(P, Q))
0.589885181619163
Q 分布からの P 分布の KL 発散は約0.589です。
この計算で使用される単位は、 Natural Unit of Informationの略称であるnatsとして知られていることに注意してください。
したがって、KL ダイバージェンスは0.589 natであると言えます。
また、KL ダイバージェンスは対称メトリックではないことにも注意してください。これは、P 分布から Q 分布の KL 発散を計算すると、おそらく異なる値が得られることを意味します。
from scipy. special import rel_entr
#calculate (Q || P)
sum(rel_entr(Q, P))
0.497549319448034
P 分布からの Q 分布の KL 乖離は約0.497 natsです。
注: 一部の式では、KL 発散を計算するために対数 2 を使用します。この場合、ナットではなくビットの観点から発散について話しています。
追加リソース
次のチュートリアルでは、Python で他の一般的な操作を実行する方法について説明します。