การรวมการประมาณความหนาแน่นของเคอร์เนลในแบบ 2D


12

ฉันมาจากคำถามนี้ในกรณีที่ใครต้องการติดตาม

โดยทั่วไปฉันมีชุดข้อมูลΩประกอบด้วยวัตถุNซึ่งแต่ละวัตถุมีจำนวนค่าที่วัดได้ที่แนบมากับมัน (สองในกรณีนี้):

Ω=o1[x1,y1],o2[x2,y2],...,oN[xN,yN]

ฉันต้องมีวิธีการตรวจสอบน่าจะเป็นของที่ใหม่วัตถุเป็นของΩดังนั้นผมจึงได้รับคำแนะนำในคำถามว่าจะได้รับความหนาแน่นของความน่าจะเป็นผ่านประมาณการความหนาแน่นเคอร์เนลซึ่งผมเชื่อว่าผมมีอยู่แล้ว .p[xp,yp]Ωf^

เนื่องจากเป้าหมายของฉันคือการได้รับความน่าจะเป็นของวัตถุใหม่นี้ ( ) ของที่อยู่ในนี้ 2 มิติชุดข้อมูลΩ , ฉันบอกว่าจะบูรณาการรูปแบบไฟล์ PDF มากกว่า " ค่าของการสนับสนุนที่มีความหนาแน่น น้อยกว่าที่คุณสังเกตเห็น " "การตั้งข้อสังเกต" ความหนาแน่นประเมินในวัตถุใหม่P คือ: F ( x P , Y P ) ดังนั้นฉันต้องแก้สมการ:p[xp,yp]Ωf^f^pf^(xp,yp)

x,y:f^(x,y)<f^(xp,yp)f^(x,y)dxdy

PDF ของชุดข้อมูล 2D ของฉัน (ได้รับผ่านโมดูลstats.gaussian_kdeของ python ) มีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่จุดสีแดงแสดงถึงวัตถุใหม่พล็อตบน PDF ของชุดข้อมูลของฉันp[xp,yp]

ดังนั้นคำถามคือ: ฉันจะคำนวณอินทิกรัลด้านบนสำหรับขีด จำกัดเมื่อ pdf มีลักษณะเช่นนั้นx,y:f^(x,y)<f^(xp,yp)


เพิ่ม

ฉันทำการทดสอบบางอย่างเพื่อดูว่าวิธี Monte Carlo ดีแค่ไหนที่ฉันพูดถึงในความคิดเห็นข้อใดข้อหนึ่งทำงานได้ นี่คือสิ่งที่ฉันได้รับ:

ตาราง

ค่าดูเหมือนจะแตกต่างกันเล็กน้อยสำหรับพื้นที่ความหนาแน่นต่ำกว่าด้วยแบนด์วิดท์ทั้งสองแสดงความผันแปรเดียวกันมากขึ้นหรือน้อยลง การเปลี่ยนแปลงที่ใหญ่ที่สุดในตารางเกิดขึ้นจุด (x, y) = (2.4,1.5) เปรียบเทียบ 2500 VS 1000 คุ้มค่าตัวอย่าง Silverman ซึ่งจะช่วยให้ความแตกต่างหรือ0.0126 ~1.3%ในกรณีของฉันนี้จะเป็นที่ยอมรับส่วนใหญ่

แก้ไข : ผมเพิ่งสังเกตเห็นว่าใน 2 มิติกฎของสกอตต์จะเทียบเท่ากับ Silverman ตามคำนิยามที่กำหนดที่นี่


2
คุณสังเกตเห็นว่าตัวประมาณของคุณไม่ได้เป็นแบบ Unimodal แต่คำแนะนำที่คุณติดตามอย่างชัดเจนนั้นมีผลเฉพาะกับการกระจายแบบ "unimodal" เท่านั้น? ไม่ได้หมายความว่าคุณกำลังทำสิ่งผิดปกติ แต่ควรสร้างความคิดอย่างหนักเกี่ยวกับคำตอบที่อาจหมายถึง
whuber

สวัสดี @ โฮเบอร์จริง ๆ แล้วคำตอบในคำถามนั้นบอกว่ามันเป็น "พฤติกรรมที่ดี" สำหรับการแจกแจงแบบไม่ต่อเนื่องดังนั้นฉันคิดว่าบางทีมันอาจจะสามารถแก้ไขปัญหาของฉันได้ด้วยการดัดแปลงบางอย่าง "ความประพฤติดี" หมายถึง "ใช้งานได้เฉพาะ" ในศัพท์แสงทางสถิติ (คำถามที่ซื่อสัตย์) หรือไม่? ไชโย
Gabriel

ความกังวลหลักของฉันอยู่ที่ KDE อาจจะมีความไวต่อทางเลือกของแบนด์วิดธ์และผมคาดว่าหนึ่งของคุณโดยเฉพาะอย่างยิ่งสำหรับสถานที่ร่อแร่เช่นเดียวกับที่แสดงในภาพจะเป็นมากไวต่อการเลือก (วิธีการคำนวณนั้นง่ายมากเมื่อคุณสร้างภาพแรสเตอร์เช่นนี้: มันเป็นสัดส่วนกับค่าเฉลี่ยในภาพระหว่างจุดที่มีค่าน้อยกว่าจุด "โพรบ") คุณสามารถเข้าใกล้ สิ่งนี้โดยการคำนวณคำตอบสำหรับแบนด์วิดท์ที่เหมาะสมและดูว่ามันเปลี่ยนไปในทางที่เป็นสาระสำคัญหรือไม่ภายในช่วงนั้น ถ้าไม่คุณก็ไม่เป็นไร
whuber

ฉันจะไม่แสดงความคิดเห็นเกี่ยวกับการแก้ปัญหา แต่การรวมสามารถทำได้โดย Monte Carlo ง่ายๆ: คะแนนตัวอย่างจาก (นั่นง่ายเนื่องจาก kde เป็นส่วนผสมของความหนาแน่นที่ง่ายต่อการสุ่มตัวอย่าง) และนับ เศษส่วนของคะแนนที่อยู่ในขอบเขตการรวมกลุ่ม (ซึ่งมีความไม่เท่าเทียมกัน) f^
Zen

คุณมีข้อสังเกตกี่ชุดในชุดข้อมูลของคุณ?
Hong Ooi

คำตอบ:


11

วิธีง่ายๆคือการแรสเตอร์โดเมนของการรวมและคำนวณการประมาณที่ไม่ต่อเนื่องกับอินทิกรัล

มีบางสิ่งที่ต้องระวังคือ:

  1. ตรวจสอบให้แน่ใจว่าครอบคลุมมากกว่าจุดต่าง ๆ :คุณต้องรวมตำแหน่งที่ตั้งทั้งหมดที่การประมาณความหนาแน่นของเคอร์เนลจะมีค่าที่เห็นได้ ซึ่งหมายความว่าคุณต้องขยายขอบเขตของคะแนนด้วยแบนด์วิธเคอร์เนลสามถึงสี่เท่า (สำหรับเคอร์เนล Gaussian)

  2. ผลลัพธ์จะแตกต่างกันบ้างตามความละเอียดของภาพแรสเตอร์ ความละเอียดต้องเป็นส่วนเล็ก ๆ ของแบนด์วิดท์ เนื่องจากเวลาในการคำนวณเป็นสัดส่วนกับจำนวนเซลล์ในแรสเตอร์จึงไม่ต้องใช้เวลาเพิ่มในการคำนวณแบบอนุกรมโดยใช้ความละเอียดที่หยาบกว่าที่ตั้งใจไว้: ตรวจสอบว่าผลลัพธ์ของการ coarser นั้นมาบรรจบกับผลลัพธ์สำหรับ ความละเอียดที่ดีที่สุด หากไม่เป็นเช่นนั้นอาจจำเป็นต้องมีการแก้ไขที่ละเอียดยิ่งขึ้น

นี่คือภาพประกอบสำหรับชุดข้อมูล 256 คะแนน:

รูปที่ 1

คะแนนจะแสดงเป็นจุดสีดำที่ซ้อนทับบนการประมาณความหนาแน่นของเคอร์เนลสองตัว จุดสีแดงขนาดใหญ่หกจุดคือ "โพรบ" ซึ่งอัลกอริทึมได้รับการประเมิน สิ่งนี้ทำสำหรับสี่แบนด์วิดท์ (ค่าเริ่มต้นระหว่าง 1.8 (แนวตั้ง) และ 3 (แนวนอน), 1/2, 1 และ 5 ยูนิต) ที่ความละเอียด 1000 ถึง 1,000 เซลล์ เมทริกซ์ scatterplot ต่อไปนี้แสดงให้เห็นว่าผลลัพธ์ยิ่งขึ้นอยู่กับแบนด์วิดท์สำหรับจุดโพรบทั้งหกจุดซึ่งครอบคลุมความหนาแน่นที่หลากหลาย:

รูปที่ 2

การเปลี่ยนแปลงที่เกิดขึ้นด้วยเหตุผลสองประการ เห็นได้ชัดว่าการประเมินความหนาแน่นแตกต่างกันแนะนำรูปแบบหนึ่งของการเปลี่ยนแปลง ที่สำคัญกว่านั้นความแตกต่างของการประมาณความหนาแน่นสามารถสร้างความแตกต่างได้มากณ จุดใดจุดหนึ่ง ("โพรบ") รูปแบบหลังนั้นยิ่งใหญ่ที่สุดรอบ "ความหนาแน่น" ของกลุ่มจุดที่มีความหนาแน่นปานกลาง - สถานที่เหล่านั้นที่การคำนวณนี้น่าจะถูกใช้มากที่สุด

สิ่งนี้แสดงให้เห็นถึงความจำเป็นในการใช้ความระมัดระวังอย่างมากในการใช้และตีความผลลัพธ์ของการคำนวณเหล่านี้เนื่องจากอาจมีความอ่อนไหวต่อการตัดสินใจโดยพลการ (แบนด์วิดท์ที่ใช้)


รหัส R

อัลกอริทึมนั้นมีอยู่ในครึ่งโหลของฟังก์ชันแรก, f. เพื่อแสดงให้เห็นถึงการใช้งานส่วนที่เหลือของรหัสสร้างตัวเลขก่อนหน้า

library(MASS)     # kde2d
library(spatstat) # im class
f <- function(xy, n, x, y, ...) {
  #
  # Estimate the total where the density does not exceed that at (x,y).
  #
  # `xy` is a 2 by ... array of points.
  # `n`  specifies the numbers of rows and columns to use.
  # `x` and `y` are coordinates of "probe" points.
  # `...` is passed on to `kde2d`.
  #
  # Returns a list:
  #   image:    a raster of the kernel density
  #   integral: the estimates at the probe points.
  #   density:  the estimated densities at the probe points.
  #
  xy.kde <- kde2d(xy[1,], xy[2,], n=n, ...)
  xy.im <- im(t(xy.kde$z), xcol=xy.kde$x, yrow=xy.kde$y) # Allows interpolation $
  z <- interp.im(xy.im, x, y)                            # Densities at the probe points
  c.0 <- sum(xy.kde$z)                                   # Normalization factor $
  i <- sapply(z, function(a) sum(xy.kde$z[xy.kde$z < a])) / c.0
  return(list(image=xy.im, integral=i, density=z))
}
#
# Generate data.
#
n <- 256
set.seed(17)
xy <- matrix(c(rnorm(k <- ceiling(2*n * 0.8), mean=c(6,3), sd=c(3/2, 1)), 
               rnorm(2*n-k, mean=c(2,6), sd=1/2)), nrow=2)
#
# Example of using `f`.
#
y.probe <- 1:6
x.probe <- rep(6, length(y.probe))
lims <- c(min(xy[1,])-15, max(xy[1,])+15, min(xy[2,])-15, max(xy[2,]+15))
ex <- f(xy, 200, x.probe, y.probe, lim=lims)
ex$density; ex$integral
#
# Compare the effects of raster resolution and bandwidth.
#
res <- c(8, 40, 200, 1000)
system.time(
  est.0 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, lims=lims)$integral))
est.0
system.time(
  est.1 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=1, lims=lims)$integral))
est.1
system.time(
  est.2 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=1/2, lims=lims)$integral))
est.2
system.time(
  est.3 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=5, lims=lims)$integral))
est.3
results <- data.frame(Default=est.0[,4], Hp5=est.2[,4], 
                      H1=est.1[,4], H5=est.3[,4])
#
# Compare the integrals at the highest resolution.
#
par(mfrow=c(1,1))
panel <- function(x, y, ...) {
  points(x, y)
  abline(c(0,1), col="Red")
}
pairs(results, lower.panel=panel)
#
# Display two of the density estimates, the data, and the probe points.
#
par(mfrow=c(1,2))
xy.im <- f(xy, 200, x.probe, y.probe, h=0.5)$image
plot(xy.im, main="Bandwidth=1/2", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)

xy.im <- f(xy, 200, x.probe, y.probe, h=5)$image
plot(xy.im, main="Bandwidth=5", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)

คำตอบที่น่าอัศจรรย์แม้ว่าฉันไม่แน่ใจว่าฉันเข้าใจความหมายของDefaultและHp5แบนด์วิดธ์ (ฉันถือว่าH1และH5หมายถึงh=1และh=5) เป็นHp5ค่าh=1/2หรือไม่ ถ้าอย่างนั้นคือDefaultอะไร
Gabriel

1
ความเข้าใจของคุณถูกต้อง ( "P5" หมายถึง" 0.5" .) เริ่มต้นคือการคำนวณอัตโนมัติโดยใช้kde2d bandwidth.nrdสำหรับข้อมูลตัวอย่างมันเท่ากับในทิศทางแนวนอนและในทิศทางแนวตั้งประมาณครึ่งทางระหว่างค่าและในการทดสอบ โปรดสังเกตว่าแบนด์วิดท์เริ่มต้นเหล่านี้มีขนาดใหญ่พอที่จะวางสัดส่วนที่รับรู้ได้ของความหนาแน่นทั้งหมดได้ดีเกินขอบเขตของคะแนนซึ่งเป็นสาเหตุที่ขอบเขตนั้นจำเป็นต้องขยายโดยไม่คำนึงถึงอัลกอริทึมการรวมที่คุณอาจเลือกใช้ 31.8515
whuber

ดังนั้นฉันเข้าใจถูกต้องหรือไม่ถ้าฉันบอกว่าเมื่อฉันเพิ่มแบนด์วิดท์ที่ใช้ขอบเขตของผลลัพธ์kdeก็เพิ่มขึ้นด้วย (และฉันต้องขยายขีด จำกัด การรวม)? เนื่องจากฉันสามารถอยู่กับข้อผิดพลาด<10%ในผลลัพธ์ที่เกิดจากอินทิกรัลคุณคิดอย่างไรเกี่ยวกับการใช้กฎของสกอตต์
Gabriel

ผมคิดว่าเป็นเพราะกฎเหล่านี้ได้รับการพัฒนาสำหรับวัตถุประสงค์ที่แตกต่างกันอย่างสิ้นเชิงคุณควรสงสัยว่าพวกเขาอาจจะทำงานได้ไม่ดีสำหรับวัตถุประสงค์ของคุณโดยเฉพาะถ้ามันคือการใช้ข้อเสนอแนะได้ที่stats.stackexchange.com/questions/63263 เป็นเรื่องก่อนกำหนดที่จะต้องกังวลว่าคุณควรใช้กฏง่ายๆสำหรับ KDE; ในขั้นตอนนี้คุณควรกังวลอย่างจริงจังว่าแนวทางทั้งหมดจะทำงานได้อย่างน่าเชื่อถือหรือไม่
whuber

1
ขีดข่วนด้านบน ฉันทำไม่มีทางรู้ถ้าการดำเนินการเป็นที่ทำงานและแม้กระทั่งของปริมาณวิธีที่ดีที่จะทำงาน มันค่อนข้างซับซ้อนและใช้เวลานาน แต่ฉันสามารถทำได้
Gabriel

1

หากคุณมีจำนวนการสังเกตที่เหมาะสมคุณอาจไม่จำเป็นต้องทำการรวมใด ๆ เลย บอกว่าจุดใหม่ของคุณ 0 สมมติว่าคุณมีตัวประมาณความหนาแน่น ; สรุปจำนวนการสังเกตที่และหารด้วยขนาดตัวอย่าง สิ่งนี้จะช่วยให้คุณประมาณความน่าจะเป็นที่ต้องการx0f^xf^(x)<f^(x0)

สิ่งนี้จะถือว่าไม่ใช่ "เล็กเกินไป" และขนาดตัวอย่างของคุณมีขนาดใหญ่พอ (และกระจายออกมากพอ) เพื่อให้การประเมินที่เหมาะสมในพื้นที่ที่มีความหนาแน่นต่ำ 20000 กรณีจะดูเหมือนมากพอ แต่สำหรับ bivariate{x}}f^(x0)x


เรายินดีต้อนรับการวิเคราะห์เชิงปริมาณของคำแนะนำนี้หรืออย่างน้อยหนึ่งตัวอย่างของการใช้งานจริง ฉันสงสัยว่าความถูกต้องของข้อเสนอของคุณเป็นอย่างมากขึ้นอยู่กับรูปร่างของเคอร์เนล สิ่งนี้จะทำให้ฉันลังเลที่จะพึ่งพาการคำนวณดังกล่าวโดยไม่ต้องศึกษาคุณสมบัติอย่างมาก
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.