सबसे अधिक फैले हुए स्थानों को कैसे खोजें?


9

शायद एक बहुत ही सरल सवाल। मेरे पास लगभग एक हजार संभावित भौगोलिक स्थानों की एक सूची है। मुझे लगता है कि उच्चतम कुल औसत दूरी के साथ 200 अंक होंगे। एक शहर में दुकानों के बारे में सोचो।

क्या इसे करने के लिए कोई परिभाषित विधि है? शायद एक आर-पैकेज में?

यह सीखने के लिए शानदार जगह बनाने वाले सभी का धन्यवाद!

/ क्रिस


क्या आपने अपने अध्ययन की एक डेलॉने त्रिभुज गणना की है जो उन क्षेत्रों को देखने के लिए एक अग्रदूत के रूप में हैं जो अधिकतम हैं? शायद यह आपको अपनी जांच के क्षेत्र को संकीर्ण करने में मदद करेगा।

यह एक बड़ा सवाल है। मुझे आश्चर्य है कि, अगर शीर्षक को "स्प्रेड आउट" से "पृथक" या "रिमोट" में बदला जा सकता है। या हो सकता है कि इसके लिए एक अधिक औपचारिक शब्द हो?
किर्क कुएकेन्डल

जवाबों:


10

सरल प्रश्न, कठिन समाधान।

सबसे अच्छी विधि जो मुझे पता है कि सिम्युलेटेड एनेलिंग का उपयोग करता है (मैंने इसका इस्तेमाल दसियों हज़ार में से कुछ दर्जन बिंदुओं का चयन करने के लिए किया है और यह 200 अंकों का चयन करने के लिए बहुत अच्छी तरह से मापता है: स्केलिंग सबलाइनर है), लेकिन इसके लिए सावधानीपूर्वक कोडिंग और काफी प्रयोग की आवश्यकता होती है, जैसा कि साथ ही संगणना की एक बड़ी राशि। आपको पहले सरल, तेज तरीकों को देखकर शुरू करना चाहिए कि क्या वे पर्याप्त हैं।

स्टोर लोकेशंस को क्लस्टर करने का एक तरीका सबसे पहले है । प्रत्येक क्लस्टर के भीतर क्लस्टर केंद्र के निकटतम स्टोर का चयन करें।

एक बहुत तेजी से क्लस्टरिंग विधि K- साधन है । यहां एक Rसमाधान है जो इसका उपयोग करता है।

scatter <- function(points, nClusters) {
    #
    # Find clusters.  (Different methods will yield different results.)
    #
    clusters <- kmeans(points, nClusters)
    #
    # Select the point nearest the center of each cluster.
    #
    groups <- clusters$cluster
    centers <- clusters$centers
    eps <- sqrt(min(clusters$withinss)) / 1000
    distance <- function(x,y) sqrt(sum((x-y)^2))
    f <- function(k) distance(centers[groups[k],], points[k,])
    n <- dim(points)[1]
    radii <- apply(matrix(1:n), 1, f) + runif(n, max=eps)
    # (Distances are changed randomly to select a unique point in each cluster.)
    minima <- tapply(radii, groups, min)
    points[radii == minima[groups],]
}

तर्क scatterस्टोर के स्थानों ( 2 मैट्रिक्स द्वारा एन के रूप में ) और चयन करने के लिए स्टोर की संख्या (जैसे, 200) की एक सूची है। यह स्थानों की एक सरणी देता है।

अपने आवेदन के एक उदाहरण के रूप में, चलो n = 1000 बेतरतीब ढंग से स्थित भंडार उत्पन्न करते हैं और देखते हैं कि समाधान क्या दिखता है:

# Create random points for testing.
#
set.seed(17)
n <- 1000
nClusters <- 200
points <- matrix(rnorm(2*n, sd=10), nrow=n, ncol=2)
#
# Do the work.
#
system.time(centers <- scatter(points, nClusters))
#
# Map the stores (open circles) and selected ones (closed circles).
#
plot(centers, cex=1.5, pch=19, col="Gray", xlab="Easting (Km)", ylab="Northing")
points(points, col=hsv((1:nClusters)/(nClusters+1), v=0.8, s=0.8))

इस गणना में 0.03 सेकंड लगे:

आकृति

आप देख सकते हैं कि यह बहुत अच्छा नहीं है (लेकिन यह बहुत बुरा भी नहीं है)। बहुत बेहतर करने के लिए या तो स्टोकेस्टिक विधियों की आवश्यकता होने वाली है, जैसे कि नकली एनालाइजिंग, या एल्गोरिदम जो समस्या के आकार के साथ तेजी से बड़े पैमाने पर होने की संभावना रखते हैं। (मैंने इस तरह के एक एल्गोरिथ्म को लागू किया है: 20 में से 10 सबसे व्यापक रूप से स्थान बिंदुओं का चयन करने में 12 सेकंड लगते हैं। इसे 200 समूहों में लागू करना सवाल से बाहर है।)

K- साधनों का एक अच्छा विकल्प एक पदानुक्रमित क्लस्टरिंग एल्गोरिथ्म है; पहले "वार्ड" विधि का प्रयास करें और अन्य लिंकेज के साथ प्रयोग करने पर विचार करें। यह अधिक संगणना लेगा, लेकिन हम अभी भी 1000 दुकानों और 200 समूहों के लिए कुछ सेकंड के बारे में बात कर रहे हैं।

अन्य विधियाँ मौजूद हैं। उदाहरण के लिए, आप इस क्षेत्र को एक नियमित हेक्सागोनल ग्रिड के साथ कवर कर सकते हैं और एक या एक से अधिक स्टोर वाले कक्षों के लिए, इसके केंद्र के निकटतम स्टोर का चयन करें। लगभग 200 दुकानों का चयन होने तक कोशिकाओं के साथ थोड़ा खेलें। यह दुकानों के एक बहुत ही नियमित अंतराल का उत्पादन करेगा, जिसे आप चाहते हैं या नहीं कर सकते हैं। (यदि ये वास्तव में स्टोर स्थान हैं, तो यह संभवतः एक बुरा समाधान होगा, क्योंकि इसमें कम से कम आबादी वाले क्षेत्रों में स्टोर चुनने की प्रवृत्ति होगी। अन्य अनुप्रयोगों में यह एक बेहतर समाधान हो सकता है।)


वाह, अच्छा और प्रभावशाली। यह एक ऐसा समाधान है जिसका मैं अब उपयोग कर सकता हूं, मैंने बहुत कुछ सीखा है, और मुझे पता है कि मुझे अध्ययन जारी रखना है। आपका बहुत बहुत धन्यवाद! और एक शानदार सप्ताहांत है!
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.