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 で他の一般的な操作を実行する方法について説明します。

Python で相関行列を作成する方法
Python で共分散行列を作成する方法

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です