2つのサンプルのカルバックライブラーダイバージェンス


10

2つのサンプルのカルバックライブラーダイバージェンスの数値推定を実装しようとしました。実装をデバッグするには、2つの正規分布およびからサンプルを引き出します。N(0,1)N(1,2)

簡単な見積もりの​​ために、2つのヒストグラムを生成し、数値的に積分を近似しようとしました。ヒストグラムの1つのビンがゼロであるヒストグラムのこれらの部分を処理することに行き詰まり、最終的にゼロで除算するか、ゼロの対数で終わらせました。この問題をどのように処理しますか?

関連する質問が頭に浮かびました。2つの異なる一様分布間のKLダイバージェンスを正確に計算する方法は?統合を両方のディストリビューションのサポートの結合に制限する必要がありますか?


まあ、正規分布のサポートは実数のセットです。純粋な数学には問題はありませんが、そうです、数値近似の場合、サンプルサイズが、統合する領域に対して十分に大きいことを確認する必要があります。純粋な数学でできるように(-inf、+ inf)を統合することはできません...妥当なものを探しますか?平均から3標準偏差以上離れている場合は、かなり薄くなります...
Matthew Gunn

1
2番目の質問に関しては、2つの異なる一様分布間のKLダイバージェンスは未定義です(は未定義です)。同様に、2つの経験的分布のKLダイバージェンスは、各サンプルに、他のサンプルのすべての観測値と同じ値を持つ少なくとも1つの観測値がない限り、未定義です。log(0)
jbowman

@jbowman小さなメモ。あなたが正しいことをしているが、未定義(またはされて)、それは治療のために、情報理論では通例であるとして。log(0)log(0)00
Luca Citi

回答:


9

カルバックライブラーダイバージェンスは、として定義され なので、必要な経験データからこれを計算(推定)するには、おそらく密度関数いくつかの推定が必要です。そのため、自然な出発点は、密度推定(そしてその後、数値積分)によるものである可能性があります。このような方法がどれほど優れているか、または安定しているかはわかりません。

KL(P||Q)=p(x)logp(x)q(x)dx
p(x),q(x)

しかし、最初に2番目の質問をしてから、最初の質問に戻ります。とがそれぞれと上の均一密度であるとしましょう。次に、 whileを定義するのはより困難ですが、それを与えるための唯一の妥当な値は、私が見る限り、。を統合して、これをとして解釈することを選択できます。この結果は、カルバックライブラー(KL)の分岐に関する直観で私が与える解釈から妥当です。pq[0,1][0,10]KL(p||q)=log10KL(q||p)log(1/0)log

メインの質問に戻ります。それは非常にノンパラメトリックな方法で尋ねられ、密度に関する仮定は述べられていません。おそらくいくつかの仮定が必要です。しかし、2つの密度が同じ現象の競合モデルとして提案されていると仮定すると、おそらくそれらが同じ支配的な尺度を持っていると想定できます。:この質問に取り組む一つの論文は以下の通りである https://pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf 彼らは予備的な密度推定を必要としない方法を提案し、その性質を分析します。

(他にも多くの論文があります)。私は戻って、その紙からいくつかの詳細、アイデアを投稿します。

 EDIT               

その論文からのいくつかのアイデアは、絶対連続分布からのiidサンプルによるKL発散の推定に関するものです。1次元分布の提案を示しますが、(最近傍密度推定を使用して)ベクトルの解決策も提供します。証明については、論文を読んでください!

彼らは、経験的分布関数のバージョンを使用することを提案しますが、サンプルバージョン間で線形補間して連続バージョンを取得します。それらは 定義します。 ここで、はHeavysideステップ関数ですが、なるように定義されています。次に、線形補間された(および範囲を超えて水平方向に拡張された)関数は(は連続)です。次に、 ここで、および

Pe(x)=1ni=1nU(xxi)
UU(0)=0.5Pcc
D^(PQ)=1ni=1nlog(δPc(xi)δQc(xi))
δPc=Pc(xi)Pc(xiϵ)ϵ サンプルの最小間隔よりも小さい数値です。

必要な経験分布関数のバージョンのRコードは

my.ecdf  <-  function(x)   {
    x   <-   sort(x)
    x.u <-   unique(x)
    n  <-  length(x) 
    x.rle  <-  rle(x)$lengths
    y  <-  (cumsum(x.rle)-0.5) / n
    FUN  <-  approxfun(x.u, y, method="linear", yleft=0, yright=1,
                           rule=2)
    FUN
}          

ノートrleでの重複の場合の世話をするために使用されますx

次に、KLダイバージェンスの推定は次のようになります。

KL_est  <-  function(x, y)   {
    dx  <-  diff(sort(unique(x)))
    dy  <-  diff(sort(unique(y)))
    ex  <-  min(dx) ; ey  <-  min(dy)
    e   <-  min(ex, ey)/2
    n   <-  length(x)    
    P  <-   my.ecdf(x) ; Q  <-  my.ecdf(y)
    KL  <-  sum( log( (P(x)-P(x-e))/(Q(x)-Q(x-e)))) / n
    KL              
}

次に、小さなシミュレーションを示します。

KL  <-  replicate(1000, {x  <-  rnorm(100)
                         y <- rt(100, df=5)
                         KL_est(x, y)})
hist(KL, prob=TRUE)

これは、この推定量のサンプリング分布の(推定)を示す次のヒストグラムを提供します。

KL estimatorの標本分布

比較のために、この例では数値積分によりKLダイバージェンスを計算します。

LR  <-  function(x) dnorm(x,log=TRUE)-dt(x,5,log=TRUE)
100*integrate(function(x) dnorm(x)*LR(x),lower=-Inf,upper=Inf)$value
[1] 3.337668

うーん...違いは調査のためにここにたくさんあるほど大きいです!


5

kjetil-b-halvorsenの答えを少し拡張し、コメントしないことを申し訳ありませんが、私は評判がありません。

  1. 分析計算は(100を掛けないで)すべきであると感じています。

LR <- function(x) dnorm(x,log=TRUE)-dt(x,5,log=TRUE) integrate(function(x) dnorm(x)*LR(x),lower=-Inf,upper=Inf)$value

  1. 私が正しい場合、推定量はKL発散に収束しませんが、収束は次のように示されます:。矢印は収束を表します。D^(P||Q)D^(P||Q)1D(P||Q)

これらの2つの修正を行うと、結果はより現実的になります。


ありがとう、これを調べて私の答えを更新します。
kjetil b halvorsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.