प्रश्न तरीके का उपयोग करने के लिए पूछता है निकटतम पड़ोसियों एक में मजबूत पहचान करने के लिए जिस तरह से और सही स्थानीय बाहरी कारकों के कारण। ठीक ऐसा क्यों नहीं?
प्रक्रिया एक मजबूत स्थानीय चिकनी की गणना करने के लिए है, अवशिष्टों का मूल्यांकन करती है, और किसी भी बड़े को शून्य करती है। यह सभी आवश्यकताओं को सीधे संतुष्ट करता है और विभिन्न अनुप्रयोगों के लिए समायोजित करने के लिए पर्याप्त लचीला है, क्योंकि एक स्थानीय पड़ोस के आकार और बाहरी लोगों की पहचान के लिए सीमा को भिन्न कर सकता है।
(लचीलापन इतना महत्वपूर्ण क्यों है? क्योंकि इस तरह की कोई भी प्रक्रिया कुछ स्थानीय व्यवहारों की पहचान करने का एक अच्छा मौका है, जैसा कि "आउटलाइंग" किया जा रहा है। इस प्रकार, ऐसी सभी प्रक्रियाओं को स्मूदी माना जा सकता है । वे स्पष्ट रूप से आउटलेर के साथ कुछ विस्तार को समाप्त करेंगे। विश्लेषक विस्तार को बनाए रखने और स्थानीय बाहरी लोगों का पता लगाने में विफल रहने के बीच व्यापार बंद पर कुछ नियंत्रण की आवश्यकता है।)
इस प्रक्रिया का एक और लाभ यह है कि इसमें मानों के आयताकार मैट्रिक्स की आवश्यकता नहीं होती है। वास्तव में, यह ऐसे डेटा के लिए उपयुक्त स्थानीय चिकनी का उपयोग करके अनियमित डेटा पर भी लागू किया जा सकता है ।
R
, साथ ही अधिकांश पूर्ण-विशेषताओं वाले आँकड़ों के पैकेज में कई मजबूत स्थानीय स्मूदीज़ बनाए गए हैं, जैसे कि loess
। निम्नलिखित उदाहरण का उपयोग करके संसाधित किया गया था। मैट्रिक्स में पंक्तियाँ और स्तंभ हैं - लगभग प्रविष्टियाँ। यह एक जटिल फ़ंक्शन का प्रतिनिधित्व करता है जिसमें कई स्थानीय एक्स्ट्रामा के साथ-साथ अंकों की एक पूरी पंक्ति होती है जहां यह अलग नहीं होता है (एक "क्रीज")। से अधिक अंकों के लिए - "अतिशयोक्ति" माना जाने वाला एक बहुत ही उच्च अनुपात - गॉसियन त्रुटियों को जोड़ा गया था, जिसका मानक विचलन मूल डेटा के मानक विचलन का केवल है। यह सिंथेटिक डेटासेट वास्तविक डेटा की कई चुनौतीपूर्ण विशेषताओं को प्रस्तुत करता है।49 4000 5 % 1 / 20794940005%1/20
ध्यान दें कि ( R
सम्मेलनों के अनुसार ) मैट्रिक्स की पंक्तियों को ऊर्ध्वाधर स्ट्रिप्स के रूप में खींचा जाता है। अवशिष्टों को छोड़कर, सभी चित्र, उनके मूल्यों में छोटे बदलाव प्रदर्शित करने में मदद करने के लिए पहाड़ी हैं। इसके बिना, लगभग सभी स्थानीय आउटलेयर अदृश्य होंगे!
"Imputed" (फिक्स्ड अप) की तुलना "Real" (मूल बिना पढ़े हुए) चित्रों से करने पर, यह स्पष्ट होता है कि आउटलेयर को हटाने से क्रीज़ की कुछ चिकनी हो गई हैं, लेकिन सभी नहीं, क्रीज़ से (जो कि नीचे से चलती है , ; यह "रेजिड्यूल्स" प्लॉट में प्रकाश सियान एंगल्ड स्ट्राइप के रूप में स्पष्ट है।( 49 , 30 )(0,79)(49,30)
"अवशिष्ट" भूखंड में धब्बे स्पष्ट रूप से अलग-थलग स्थानीय स्थानीय लोगों को दिखाते हैं। यह प्लॉट अंतर्निहित संरचना के कारण अन्य संरचना (जैसे कि विकर्ण पट्टी) को प्रदर्शित करता है। डेटा के एक स्थानिक मॉडल ( भूस्थैतिक तरीकों के माध्यम से ) का उपयोग करके इस प्रक्रिया में सुधार किया जा सकता है , लेकिन इसका वर्णन और चित्रण करना हमें यहां बहुत दूर तक ले जाएगा।
BTW, इस कोड ने आउटलेयर में से केवल की खोज की, जो पेश किए गए थे। यह प्रक्रिया की विफलता नहीं है। क्योंकि आउटलेर्स सामान्य रूप से वितरित किए गए थे, उनमें से लगभग आधे शून्य - या उससे कम आकार के करीब थे , अंतर्निहित मानों की तुलना में से अधिक की रेंज में - उन्होंने सतह में कोई पता लगाने योग्य परिवर्तन नहीं किया। 200 3 6001022003600
#
# Create data.
#
set.seed(17)
rows <- 2:80; cols <- 2:50
y <- outer(rows, cols,
function(x,y) 100 * exp((abs(x-y)/50)^(0.9)) * sin(x/10) * cos(y/20))
y.real <- y
#
# Contaminate with iid noise.
#
n.out <- 200
cat(round(100 * n.out / (length(rows)*length(cols)), 2), "% errors\n", sep="")
i.out <- sample.int(length(rows)*length(cols), n.out)
y[i.out] <- y[i.out] + rnorm(n.out, sd=0.05 * sd(y))
#
# Process the data into a data frame for loess.
#
d <- expand.grid(i=1:length(rows), j=1:length(cols))
d$y <- as.vector(y)
#
# Compute the robust local smooth.
# (Adjusting `span` changes the neighborhood size.)
#
fit <- with(d, loess(y ~ i + j, span=min(1/2, 125/(length(rows)*length(cols)))))
#
# Display what happened.
#
require(raster)
show <- function(y, nrows, ncols, hillshade=TRUE, ...) {
x <- raster(y, xmn=0, xmx=ncols, ymn=0, ymx=nrows)
crs(x) <- "+proj=lcc +ellps=WGS84"
if (hillshade) {
slope <- terrain(x, opt='slope')
aspect <- terrain(x, opt='aspect')
hill <- hillShade(slope, aspect, 10, 60)
plot(hill, col=grey(0:100/100), legend=FALSE, ...)
alpha <- 0.5; add <- TRUE
} else {
alpha <- 1; add <- FALSE
}
plot(x, col=rainbow(127, alpha=alpha), add=add, ...)
}
par(mfrow=c(1,4))
show(y, length(rows), length(cols), main="Data")
y.res <- matrix(residuals(fit), nrow=length(rows))
show(y.res, length(rows), length(cols), hillshade=FALSE, main="Residuals")
#hist(y.res, main="Histogram of Residuals", ylab="", xlab="Value")
# Increase the `8` to find fewer local outliers; decrease it to find more.
sigma <- 8 * diff(quantile(y.res, c(1/4, 3/4)))
mu <- median(y.res)
outlier <- abs(y.res - mu) > sigma
cat(sum(outlier), "outliers found.\n")
# Fix up the data (impute the values at the outlying locations).
y.imp <- matrix(predict(fit), nrow=length(rows))
y.imp[outlier] <- y[outlier] - y.res[outlier]
show(y.imp, length(rows), length(cols), main="Imputed")
show(y.real, length(rows), length(cols), main="Real")