कर्नेल घनत्व अनुमानक (KDE) एक वितरण का निर्माण करता है जो कर्नेल वितरण का एक स्थान मिश्रण होता है, इसलिए कर्नेल घनत्व के मान का अनुमान लगाने के लिए आपको सभी की आवश्यकता होती है (1) कर्नेल घनत्व से मान निकालें और फिर (2) स्वतंत्र रूप से यादृच्छिक पर डेटा बिंदुओं में से एक का चयन करें और (1) के परिणाम में इसका मूल्य जोड़ें।
यहाँ इस प्रक्रिया का परिणाम है प्रश्न में एक जैसे डेटासेट के लिए लागू किया जाता है।
बाईं ओर हिस्टोग्राम नमूने को दर्शाता है। संदर्भ के लिए, काला वक्र घनत्व को प्लॉट करता है जिसमें से नमूना खींचा गया था। लाल वक्र नमूना के केडीई (एक संकीर्ण बैंडविड्थ का उपयोग करके) को प्लॉट करता है। (यह कोई समस्या नहीं है, या अप्रत्याशित भी है, कि लाल चोटियाँ काली चोटियों से छोटी हैं: KDE चीजों को फैलाता है, इसलिए चोटियों को क्षतिपूर्ति करने के लिए कम मिलेगा।)
सही पर हिस्टोग्राम KDE से एक नमूना (समान आकार का) दर्शाता है । काले और लाल वक्र पहले जैसे ही हैं।
जाहिर है, घनत्व कार्यों से नमूना करने के लिए इस्तेमाल की जाने वाली प्रक्रिया। यह बहुत तेज़ है: R
नीचे दिया गया कार्यान्वयन किसी भी केडीई से प्रति सेकंड लाखों मान उत्पन्न करता है। मैंने इसे पायथन या अन्य भाषाओं में पोर्टिंग में सहायता करने के लिए भारी टिप्पणी की है। नमूना एल्गोरिथ्म स्वयं rdens
लाइनों के साथ फ़ंक्शन में कार्यान्वित किया जाता है
rkernel <- function(n) rnorm(n, sd=width)
sample(x, n, replace=TRUE) + rkernel(n)
rkernel
ड्रॉ n
गिरी समारोह से आईआईडी नमूने जबकि sample
ड्रॉ n
डेटा से प्रतिस्थापन के साथ नमूने x
। "+" ऑपरेटर घटक द्वारा नमूने घटक के दो सरणियों को जोड़ता है।
कएफकx =( x)1, एक्स2, ... , एक्सn)
एफएक्स^;क( x ) = 1nΣमैं = १nएफक( एक्स - एक्समैं) का है ।
एक्सएक्समैं1 / एनमैंYएक्स+ यएक्सएक्स
एफएक्स+ य( x )= पीआर ( एक्स)+ य≤ x )= ∑मैं = १nपीआर ( एक्स)+ य∣ x ≤ एक्स= एक्समैं) पीआर ( एक्स= एक्समैं)= ∑मैं = १nपीआर ( एक्स)मैं+ य≤ एक्स ) 1n= 1nΣमैं = १nपीआर ( वाई≤ एक्स - एक्समैं)= 1nΣमैं = १nएफक( एक्स - एक्समैं)= एफएक्स^;क( x ) ,
जैसा दावा किया गया है।
#
# Define a function to sample from the density.
# This one implements only a Gaussian kernel.
#
rdens <- function(n, density=z, data=x, kernel="gaussian") {
width <- z$bw # Kernel width
rkernel <- function(n) rnorm(n, sd=width) # Kernel sampler
sample(x, n, replace=TRUE) + rkernel(n) # Here's the entire algorithm
}
#
# Create data.
# `dx` is the density function, used later for plotting.
#
n <- 100
set.seed(17)
x <- c(rnorm(n), rnorm(n, 4, 1/4), rnorm(n, 8, 1/4))
dx <- function(x) (dnorm(x) + dnorm(x, 4, 1/4) + dnorm(x, 8, 1/4))/3
#
# Compute a kernel density estimate.
# It returns a kernel width in $bw as well as $x and $y vectors for plotting.
#
z <- density(x, bw=0.15, kernel="gaussian")
#
# Sample from the KDE.
#
system.time(y <- rdens(3*n, z, x)) # Millions per second
#
# Plot the sample.
#
h.density <- hist(y, breaks=60, plot=FALSE)
#
# Plot the KDE for comparison.
#
h.sample <- hist(x, breaks=h.density$breaks, plot=FALSE)
#
# Display the plots side by side.
#
histograms <- list(Sample=h.sample, Density=h.density)
y.max <- max(h.density$density) * 1.25
par(mfrow=c(1,2))
for (s in names(histograms)) {
h <- histograms[[s]]
plot(h, freq=FALSE, ylim=c(0, y.max), col="#f0f0f0", border="Gray",
main=paste("Histogram of", s))
curve(dx(x), add=TRUE, col="Black", lwd=2, n=501) # Underlying distribution
lines(z$x, z$y, col="Red", lwd=2) # KDE of data
}
par(mfrow=c(1,1))