カルバックライブラーダイバージェンスは、として定義され
なので、必要な経験データからこれを計算(推定)するには、おそらく密度関数いくつかの推定が必要です。そのため、自然な出発点は、密度推定(そしてその後、数値積分)によるものである可能性があります。このような方法がどれほど優れているか、または安定しているかはわかりません。
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)=1n∑i=1nU(x−xi)
UU(0)=0.5PccD^(P∥Q)=1n∑i=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ダイバージェンスを計算します。
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
うーん...違いは調査のためにここにたくさんあるほど大きいです!