1

Rで2つの分布のJS発散を見つけたいと思います。ウィキペディアでは、2を底とする対数を使用すると、イェンセン・シャノン発散は1で制限されると述べています。結果として生じるJSの発散が0と1の間にあることを望みます。私はRでKLdiv関数を使用してJSを見つけています。

JSD(P || Q)= 1/2*D(P || M) + 1/2*D(Q || M)  

ここで、カルバック・ライブラー発散KLdiv(P、M)= D(P || M)

しかし、2を底とする対数が必​​要であることを指定したいと思います。KLdivでは、使用するログを指定できないようです。それを行う方法についての手がかりはありますか?

これは、2つの分布間のJSdivergenceを見つけるためのRコードです。

library(flexmix)
m <- 0.5 *(dist1 + dist2) #JSD(P||Q)=0.5*D(P||M) + 0.5*D(Q||M), where M=0.5*(P+Q)
Dpm <- KLdiv(cbind(dist1,m))
Dqm <- KLdiv(cbind(m,dist2))
js <- 0.5*Dpm + 0.5*Dqm

0から1までのJS値が必要です。これは、wikiによると、2を底とする対数をとる場合にのみ可能です。既存のRコードでこれを行うにはどうすればよいですか?

4

1 に答える 1

2

一般的に言って、それはそれを保持します

ここに画像の説明を入力してください

つまり、bの対数を基数aに計算したいが、任意の数の対数を基数xに計算する関数しかない場合でも、その数の対数を基数aに簡単に取得できます。

したがって:

ここに画像の説明を入力してください

したがって、ベースxに関するKLダイバージェンスを決定する場合は、ベースを使用したKLダイバージェンスの計算結果をexからベース e(またはKLdivの実装で使用されているベース)の対数で除算する必要があります。

ところで、使用しているKLdiv関数について言及するのを忘れていました。

次に、Rコードを見ると、JSの相違、特にMの定義を読み直したいと思うかもしれません。

于 2012-07-01T18:13:07.977 に答える