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

R で正規分布を生成する方法
R で正規分布をプロットする方法

コメントを追加する

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