R での kl 発散を計算する方法 (例あり)
統計学において、カルバック・ライブラー (KL) 発散は、 2 つの確率分布間の差異を定量化する距離指標です。
2 つの確率分布 P と Q がある場合、一般に KL(P || Q) という表記を使用して KL 発散を書きます。これは、「Q からの P の発散」を意味します。
次の式を使用して計算します。
KL(P || Q) = ΣP(x) ln (P(x) / Q(x))
2 つの分布間の KL 発散がゼロの場合、これは分布が同一であることを示します。
R の 2 つの確率分布間の KL 発散を計算する最も簡単な方法は、 philentropyパッケージのKL()関数を使用することです。
次の例は、この関数を実際に使用する方法を示しています。
例: R での KL 発散の計算
R に次の 2 つの確率分布があるとします。
#define two probability distributions
P <- c(.05, .1, .2, .05, .15, .25, .08, .12)
Q <- c(.3, .1, .2, .1, .1, .02, .08, .1)
注: 各分布の確率の合計が 1 になることが重要です。
次のコードを使用して、2 つの分布間の KL 発散を計算できます。
library (philentropy)
#rbind distributions into one matrix
x <- rbind(P,Q)
#calculate KL divergence
KL(x, unit=' log ')
Metric: 'kullback-leibler' using unit: 'log'; comparing: 2 vectors.
kullback-leibler
0.5898852
Q 分布からの P 分布の KL 発散は約0.589です。
この計算で使用される単位は、 Natural Unit of Informationの略称であるnatsとして知られていることに注意してください。
したがって、KL ダイバージェンスは0.589 natであると言えます。
また、KL ダイバージェンスは対称メトリックではないことにも注意してください。これは、P 分布から Q 分布の KL 発散を計算すると、おそらく異なる値が得られることを意味します。
library (philentropy)
#rbind distributions into one matrix
x <- rbind(Q,P)
#calculate KL divergence
KL(x, unit=' log ')
Metric: 'kullback-leibler' using unit: 'log'; comparing: 2 vectors.
kullback-leibler
0.4975493
P 分布からの Q 分布の KL 乖離は約0.497 natsです。
また、一部の式では KL 発散を計算するために対数 2 を使用することにも注意してください。この場合、ナットではなくビットの観点から発散について話しています。
KL 発散をビット単位で計算するには、 unit引数で log2 を使用できます。
library (philentropy)
#rbind distributions into one matrix
x <- rbind(P,Q)
#calculate KL divergence (in bits)
KL(x, unit=' log2 ')
Metric: 'kullback-leibler' using unit: 'log2'; comparing: 2 vectors.
kullback-leibler
0.7178119
Q 分布からの P 分布の KL 発散は約0.7178 ビットです。
追加リソース
次のチュートリアルでは、R で他の一般的なタスクを実行する方法について説明します。