Kullback-Leibler divergence ถูกกำหนดเป็น
เพื่อให้การคำนวณ (ประมาณการ) นี้จากข้อมูลเชิงประจักษ์เราจะต้องอาจจะประมาณการของฟังก์ชั่นความหนาแน่นบาง(x) จุดเริ่มต้นตามธรรมชาติอาจเกิดจากการประมาณความหนาแน่น (และหลังจากนั้นเพียงแค่การรวมตัวเลข) ฉันจะไม่รู้วิธีการที่ดีหรือมีเสถียรภาพp ( x ) , q ( x )
KL(P||Q)=∫∞−∞p(x)logp(x)q(x)dx
p(x),q(x)
แต่ก่อนอื่นคำถามที่สองของคุณฉันจะกลับไปที่คำถามแรก ให้บอกว่าและเป็นความหนาแน่นสม่ำเสมอในและตามลำดับ ดังนั้นในขณะที่นั้นยากต่อการนิยาม แต่ค่าที่สมเหตุสมผลเพียงอย่างเดียวที่จะให้มันคือเท่าที่ฉันเห็นเนื่องจากมันเกี่ยวข้องกับ การบูรณาการซึ่งเราสามารถเลือกที่จะเป็น interprete\ ผลลัพธ์นี้มีความสมเหตุสมผลจากการตีความที่ฉันให้ไว้ในสัญชาตญาณ Kullback-Leibler (KL) ความแตกต่างpq[0,1][0,10]KL(p||q)=log10KL(q||p)∞log(1/0)log∞
กลับไปที่คำถามหลัก มันถูกถามในลักษณะที่ไม่มีพารามิเตอร์และไม่มีการตั้งสมมติฐานเกี่ยวกับความหนาแน่น อาจจำเป็นต้องใช้สมมติฐานบางอย่าง แต่สมมติว่ามีการเสนอความหนาแน่นทั้งสองแบบเป็นแบบจำลองการแข่งขันสำหรับปรากฏการณ์เดียวกันเราอาจสันนิษฐานได้ว่าพวกมันมีวิธีการที่เหมือนกันนั่นคือการแยก KL ระหว่างความต่อเนื่องและการแจกแจงความน่าจะเป็นแบบไม่ต่อเนื่อง กระดาษหนึ่งที่ตอบคำถามนี้มีดังต่อไปนี้: https://pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf พวกเขาเสนอวิธีการที่ไม่ต้องการการประเมินความหนาแน่นเบื้องต้นและวิเคราะห์คุณสมบัติของมัน
(มีเอกสารอื่น ๆ อีกมากมาย) ฉันจะกลับมาและโพสต์รายละเอียดบางอย่างจากกระดาษความคิด
EDIT
แนวคิดบางประการจากกระดาษนั้นซึ่งเกี่ยวกับการประมาณค่าความแตกต่างของ KL กับตัวอย่าง iid จากการแจกแจงแบบต่อเนื่องอย่างแน่นอน ฉันแสดงข้อเสนอของพวกเขาสำหรับการแจกแจงแบบหนึ่งมิติ แต่พวกเขาให้คำตอบสำหรับเวกเตอร์ด้วย (โดยใช้การประมาณความหนาแน่นของเพื่อนบ้านที่ใกล้ที่สุด) สำหรับหลักฐานที่อ่านกระดาษ!
พวกเขาเสนอให้ใช้รุ่นของฟังก์ชันการกระจายเชิงประจักษ์ แต่สอดแทรกเชิงเส้นตรงระหว่างจุดตัวอย่างเพื่อให้ได้รุ่นต่อเนื่อง พวกเขากำหนด
ที่เป็นฟังก์ชั่นขั้นตอน Heavyside แต่กำหนดไว้เพื่อให้Uจากนั้นฟังก์ชั่นนั้นสอดแทรกเชิงเส้น (และขยายในแนวนอนเกินขอบเขต) คือ (สำหรับต่อเนื่อง) จากนั้นพวกเขาเสนอให้ประเมินความแตกต่างของ Kullback-Leibler โดย
โดยที่และ
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 divergence
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 divergence ในตัวอย่างนี้โดยการรวมตัวเลข:
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
อืม ... ความแตกต่างมีขนาดใหญ่พอที่จะตรวจสอบได้ที่นี่!