यह एक मुश्किल सवाल है क्योंकि अभी तक कई नहीं हुए हैं, यदि कोई हो, तो लाइन फीचर्स के लिए स्थानिक प्रक्रिया के आँकड़े विकसित किए गए हैं। समीकरणों और कोड में गंभीरता से खुदाई किए बिना, बिंदु प्रक्रिया के आँकड़े रैखिक सुविधाओं के लिए आसानी से लागू नहीं होते हैं और इस प्रकार, सांख्यिकीय रूप से अमान्य हैं। ऐसा इसलिए है क्योंकि अशक्त, कि किसी दिए गए पैटर्न के खिलाफ परीक्षण किया जाता है, बिंदु घटनाओं पर आधारित होता है न कि यादृच्छिक क्षेत्र में रैखिक निर्भरता पर। मेरा कहना है कि मुझे यह भी पता नहीं है कि अशक्तता कितनी होगी और व्यवस्था / अभिविन्यास और भी कठिन होगा।
मैं यहां सिर्फ थूकने-बजाने का काम कर रहा हूं, लेकिन मैं सोच रहा हूं कि क्या यूक्लिडियन दूरी (या हॉसडॉर्फ दूरी अगर लाइनें जटिल हैं) के साथ मिलकर लाइन घनत्व का एक बहु-स्तरीय मूल्यांकन क्लस्टरिंग के एक निरंतर माप का संकेत नहीं देगा। यह डेटा लाइन वैक्टर के लिए संक्षेप में प्रस्तुत किया जा सकता है, लंबाई में भिन्नता (थॉमस 2011) के लिए विचरण का उपयोग करते हुए, और K- साधन जैसे एक आँकड़ा का उपयोग करके क्लस्टर मान असाइन किया गया। मुझे पता है कि आप असाइन किए गए समूहों के बाद नहीं हैं, लेकिन क्लस्टर मान क्लस्टरिंग की डिग्री को विभाजित कर सकता है। यह, जाहिर है, कश्मीर के एक इष्टतम फिट की आवश्यकता होगी, इसलिए मनमाने ढंग से समूहों को सौंपा नहीं गया है। मैं सोच रहा हूं कि ग्राफ सैद्धांतिक मॉडल में बढ़त संरचना का मूल्यांकन करने में यह एक दिलचस्प दृष्टिकोण होगा।
यहाँ R में काम किया गया उदाहरण है, क्षमा करें, लेकिन यह QGIS उदाहरण प्रदान करने की तुलना में अधिक तेज़ और अधिक प्रतिलिपि प्रस्तुत करने योग्य है, और मेरे आराम क्षेत्र में अधिक है :)
पुस्तकालयों को जोड़ें और स्पॉट उदाहरण के रूप में तांबा psp ऑब्जेक्ट का उपयोग लाइन उदाहरण के रूप में करें
library(spatstat)
library(raster)
library(spatialEco)
data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)
मानकीकृत पहली और दूसरी क्रम रेखा घनत्व की गणना करें और फिर रेखापुंज श्रेणी की वस्तुओं के साथ तालमेल करें
d1st <- density(l)
d1st <- d1st / max(d1st)
d1st <- raster(d1st)
d2nd <- density(l, sigma = 2)
d2nd <- d2nd / max(d2nd)
d2nd <- raster(d2nd)
स्केल-इंटीग्रेटेड घनत्व में 1 और 2 क्रम घनत्व को मानकीकृत करें
d <- d1st + d2nd
d <- d / cellStats(d, stat='max')
मानकीकृत उल्टे यूक्लिडियन दूरी की गणना करें और रेखापुंज वर्ग के लिए मोटे
euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))
एक spatialLinesDataFrame ऑब्जेक्ट को स्प्रैटर एक्सट्रैक्शन में उपयोग करने के लिए एक स्पैटस्टील स्पर्स के लिए कोर्स स्पैटस्टैट psp
as.SpatialLines.psp <- local({
ends2line <- function(x) Line(matrix(x, ncol=2, byrow=TRUE))
munch <- function(z) { Lines(ends2line(as.numeric(z[1:4])), ID=z[5]) }
convert <- function(x) {
ends <- as.data.frame(x)[,1:4]
ends[,5] <- row.names(ends)
y <- apply(ends, 1, munch)
SpatialLines(y)
}
convert
})
l <- as.SpatialLines.psp(l)
l <- SpatialLinesDataFrame(l, data.frame(ID=1:length(l)) )
प्लॉट का परिणाम
par(mfrow=c(2,2))
plot(d1st, main="1st order line density")
plot(l, add=TRUE)
plot(d2nd, main="2nd order line density")
plot(l, add=TRUE)
plot(d, main="integrated line density")
plot(l, add=TRUE)
plot(euclidean, main="euclidean distance")
plot(l, add=TRUE)
रेखापुंज मान निकालें और प्रत्येक रेखा से जुड़े सारांश आँकड़ों की गणना करें
l.dist <- extract(euclidean, l)
l.den <- extract(d, l)
l.stats <- data.frame(min.dist = unlist(lapply(l.dist, min)),
med.dist = unlist(lapply(l.dist, median)),
max.dist = unlist(lapply(l.dist, max)),
var.dist = unlist(lapply(l.dist, var)),
min.den = unlist(lapply(l.den, min)),
med.den = unlist(lapply(l.den, median)),
max.den = unlist(lapply(l.den, max)),
var.den = unlist(lapply(l.den, var)))
इष्टतम k। फ़ंक्शन के साथ, इष्टतम k (क्लस्टर की संख्या) का मूल्यांकन करने के लिए क्लस्टर सिल्हूट मान का उपयोग करें, फिर क्लस्टर मान को लाइनों में असाइन करें। फिर हम घनत्व क्लस्टर के शीर्ष पर प्रत्येक क्लस्टर को रंग और भूखंड सौंप सकते हैं।
clust <- optimal.k(scale(l.stats), nk = 10, plot = TRUE)
l@data <- data.frame(l@data, cluster = clust$clustering)
kcol <- ifelse(clust$clustering == 1, "red", "blue")
plot(d)
plot(l, col=kcol, add=TRUE)
इस बिंदु पर कोई परीक्षण करने के लिए लाइनों का यादृच्छिककरण कर सकता है यदि परिणामी तीव्रता और दूरी यादृच्छिक से महत्वपूर्ण है। आप "rshift.psp" फ़ंक्शन का उपयोग अपनी रेखाओं को बेतरतीब ढंग से पुनर्निर्मित करने के लिए कर सकते हैं। आप भी बस शुरुआत को रोक सकते हैं और अंक रोक सकते हैं और प्रत्येक पंक्ति को फिर से बना सकते हैं।
एक यह भी आश्चर्य है कि "क्या होगा" यदि आपने लाइनों के प्रारंभ और रुकने के बिंदुओं पर एक अविभाज्य या क्रॉस विश्लेषण सांख्यिकीय का उपयोग करके एक बिंदु पैटर्न विश्लेषण किया। एक अविभाज्य विश्लेषण में आप शुरुआत के परिणामों की तुलना करेंगे और यह देखने के लिए अंक रोकेंगे कि क्या दो बिंदु पैटर्न के बीच क्लस्टरिंग में स्थिरता है। यह F-hat, G-hat या Ripley's-K-hat (अनमार्क्ड पॉइंट प्रोसेस के लिए) के जरिए किया जा सकता है। एक अन्य दृष्टिकोण एक क्रॉस विश्लेषण होगा (उदाहरण के लिए, क्रॉस-के) जहां दो बिंदु प्रक्रियाओं को एक साथ उन्हें [प्रारंभ, रोक] के रूप में चिह्नित करके परीक्षण किया जाता है। यह प्रारंभ और रोक बिंदुओं के बीच क्लस्टरिंग प्रक्रिया में दूरी संबंधों को इंगित करेगा। तथापि, एक अंतर्निहित तीव्रता प्रक्रिया पर स्थानिक निर्भरता (नॉनस्टायोनैरिटी) इस प्रकार के मॉडल में एक मुद्दा हो सकता है जो उन्हें अमानवीय बना सकता है और एक अलग मॉडल की आवश्यकता होती है। विडंबना यह है कि अमानवीय प्रक्रिया को एक तीव्रता फ़ंक्शन का उपयोग करके तैयार किया जाता है, जो हमें पूर्ण चक्र को वापस घनत्व में लाता है, इस प्रकार क्लस्टरिंग के माप के रूप में स्केल-एकीकृत घनत्व का उपयोग करने के विचार का समर्थन करता है।
अगर Ripleys K (Besags L) स्टेटिक का उपयोग करके एक अनकवर्ड पॉइंट प्रोसेस के ऑटोकॉर्लेशन के लिए स्टेटिक का एक त्वरित काम किया गया उदाहरण है, तो लाइन फीचर क्लास के स्थानों को रोकें। अंतिम मॉडल एक क्रॉस-के है जो नाममात्र चिह्नित प्रक्रिया के रूप में स्थानों को शुरू करने और रोकने दोनों का उपयोग करता है।
library(spatstat)
data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)
Lr <- function (...) {
K <- Kest(...)
nama <- colnames(K)
K <- K[, !(nama %in% c("rip", "ls"))]
L <- eval.fv(sqrt(K/pi)-bw)
L <- rebadge.fv(L, substitute(L(r), NULL), "L")
return(L)
}
### Ripley's K ( Besag L(r) ) for start locations
start <- endpoints.psp(l, which="first")
marks(start) <- factor("start")
W <- start$window
area <- area.owin(W)
lambda <- start$n / area
ripley <- min(diff(W$xrange), diff(W$yrange))/4
rlarge <- sqrt(1000/(pi * lambda))
rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )
### Ripley's K ( Besag L(r) ) for end locations
stop <- endpoints.psp(l, which="second")
marks(stop) <- factor("stop")
W <- stop$window
area <- area.owin(W)
lambda <- stop$n / area
ripley <- min(diff(W$xrange), diff(W$yrange))/4
rlarge <- sqrt(1000/(pi * lambda))
rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )
### Ripley's Cross-K ( Besag L(r) ) for start/stop
sdata.ppp <- superimpose(start, stop)
( Lenv <- plot(envelope(sdata.ppp, fun="Kcross", r=bw, i="start", j="stop", nsim=199,nrank=5,
transform=expression(sqrt(./pi)-bw), global=TRUE) ) )
संदर्भ
थॉमस जेसीआर (2011) एक नया क्लस्टरिंग एल्गोरिदम, K- मीन्स के आधार पर एक रेखा खंड का उपयोग प्रोटोटाइप के रूप में करता है। इन: सैन मार्टिन सी।, किम स्व। (eds) पैटर्न रिकॉग्निशन, इमेज एनालिसिस, कंप्यूटर विज़न और एप्लिकेशन में प्रगति। CIARP 2011. लेक्चर नोट्स इन कंप्यूटर साइंस, वॉल्यूम 7042। स्प्रिंगर, बर्लिन, हीडलबर्ग