एक सरल तरीका एकीकरण के डोमेन को व्यवस्थित करना और एक असतत सन्निकटन की गणना करना है।
देखने के लिए कुछ चीजें हैं:
बिंदुओं की सीमा से अधिक कवर करना सुनिश्चित करें: आपको उन सभी स्थानों को शामिल करने की आवश्यकता है जहां कर्नेल घनत्व के अनुमान में कोई सराहनीय मूल्य होगा। इसका मतलब है कि आपको कर्नेल बैंडविड्थ (एक गाऊसी कर्नेल के लिए) से तीन से चार गुना तक बिंदुओं का विस्तार करना होगा।
परिणाम रेखापुंज के संकल्प के साथ कुछ अलग होगा। रिज़ॉल्यूशन को बैंडविड्थ का एक छोटा सा अंश होना चाहिए। क्योंकि गणना का समय रेखापुंज में कोशिकाओं की संख्या के लिए आनुपातिक होता है, यह लगभग एक अतिरिक्त समय नहीं लेता है, ताकि एक से अधिक मोटे संकल्पों का उपयोग करते हुए गणनाओं की एक श्रृंखला का प्रदर्शन किया जा सके: जाँच करें कि मोटे लोगों के लिए परिणाम परिणाम के लिए परिवर्तित हो रहे हैं बेहतरीन संकल्प। यदि वे नहीं हैं, तो एक महीन संकल्प की आवश्यकता हो सकती है।
यहाँ 256 बिंदुओं के डेटासेट के लिए एक चित्रण है:
अंक को दो कर्नेल घनत्व अनुमानों पर सुपरिंपल किए गए काले बिंदुओं के रूप में दिखाया गया है। छह बड़े लाल बिंदु "जांच" हैं जिस पर एल्गोरिदम का मूल्यांकन किया जाता है। यह 1000 के एक संकल्प पर चार बैंडविथ (1.8 (लंबवत) और 3 (क्षैतिज रूप से), 1/2, 1, और 5 इकाइयों के बीच एक डिफ़ॉल्ट) के लिए किया गया है। निम्न स्कैल्पलॉट मैट्रिक्स यह दर्शाता है कि परिणाम इन छह जांच बिंदुओं के लिए बैंडविड्थ पर कितनी दृढ़ता से निर्भर करते हैं, जो कि घनत्व की एक विस्तृत श्रृंखला को कवर करते हैं:
भिन्नता दो कारणों से होती है। स्पष्ट रूप से घनत्व का अनुमान भिन्न होता है, एक प्रकार की भिन्नता का परिचय देता है। इससे भी महत्वपूर्ण बात, घनत्व के अनुमानों में अंतर किसी भी एकल ("जांच") बिंदु पर बड़े अंतर पैदा कर सकता है । बाद की विविधता अंकों के समूहों के मध्यम-घनत्व "फ्रिंजेस" के आसपास सबसे बड़ी है - बिल्कुल उन स्थानों पर जहां इस गणना का सबसे अधिक उपयोग होने की संभावना है।
यह इन गणनाओं के परिणामों का उपयोग करने और उनकी व्याख्या करने में पर्याप्त सावधानी की आवश्यकता को दर्शाता है, क्योंकि वे अपेक्षाकृत मनमाने निर्णय (उपयोग करने के लिए बैंडविड्थ) के प्रति इतने संवेदनशील हो सकते हैं।
आर कोड
एल्गोरिथ्म, पहले समारोह के आधा दर्जन लाइनों में निहित है 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)