आपके प्रश्न का स्पष्टीकरण आपको इंगित करता है कि आप वास्तविक लाइन खंडों पर आधारित क्लस्टरिंग करना चाहते हैं , इस अर्थ में कि किसी भी दो मूल-गंतव्य (OD) जोड़े को "करीब" माना जाना चाहिए जब दोनों मूल पास हों और दोनों गंतव्य पास हों , चाहे जिस बिंदु को मूल या गंतव्य माना जाए ।
यह सूत्रीकरण बताता है कि आपके पास पहले से ही दो बिंदुओं के बीच की दूरी d की समझ है : यह दूरी के रूप में हो सकता है, जब विमान उड़ता है, नक्शे पर दूरी, गोल-यात्रा यात्रा का समय, या कोई अन्य मीट्रिक जो ओ और डी होने पर परिवर्तित नहीं होता है। बंद। एकमात्र जटिलता यह है कि सेगमेंट में अद्वितीय प्रतिनिधित्व नहीं होते हैं: वे अनऑर्डर्ड जोड़े {O, D} के अनुरूप होते हैं , लेकिन आदेश दिए गए जोड़े के रूप में प्रतिनिधित्व किया जाना चाहिए , (O, D) या (D, O)। इसलिए हम दो ऑर्डर किए गए जोड़े (O1, D1) और (O2, D2) के बीच की दूरी d (O1, O2) और d (D1, D2) के कुछ सममित संयोजन हो सकते हैं, जैसे कोई योग या वर्ग। उनके वर्गों के योग की जड़। आइए इस संयोजन को लिखें
distance((O1,D1), (O2,D2)) = f(d(O1,O2), d(D1,D2)).
बस दो संभव दूरी के छोटे होने के लिए अनियंत्रित जोड़े के बीच की दूरी को परिभाषित करें:
distance({O1,D1}, {O2,D2}) = min(f(d(O1,O2)), d(D1,D2)), f(d(O1,D2), d(D1,O2))).
इस बिंदु पर आप दूरी मैट्रिक्स के आधार पर किसी भी क्लस्टरिंग तकनीक को लागू कर सकते हैं।
एक उदाहरण के रूप में, मैंने सबसे अधिक आबादी वाले अमेरिकी शहरों में से 20 के लिए मानचित्र पर सभी 190 बिंदु-से-बिंदु दूरी की गणना की और एक पदानुक्रमित पद्धति का उपयोग करते हुए आठ क्लस्टर का अनुरोध किया। (सादगी के लिए मैंने यूक्लिडियन दूरी की गणना का इस्तेमाल किया और सॉफ्टवेयर में डिफ़ॉल्ट तरीकों को लागू किया जो मैं उपयोग कर रहा था: व्यवहार में आप अपनी समस्या के लिए उचित दूरी और क्लस्टरिंग विधियों का चयन करना चाहेंगे)। यहाँ समाधान है, प्रत्येक पंक्ति खंड के रंग से संकेतित समूहों के साथ। (रंग बेतरतीब ढंग से गुच्छों को सौंपा गया था।)
यहाँ R
कोड है कि इस उदाहरण का उत्पादन किया है। इसका इनपुट शहरों के लिए "देशांतर" और "अक्षांश" फ़ील्ड के साथ एक पाठ फ़ाइल है। (आकृति में शहरों को लेबल करने के लिए, इसमें "कुंजी" फ़ील्ड भी शामिल है।)
#
# Obtain an array of point pairs.
#
X <- read.csv("F:/Research/R/Projects/US_cities.txt", stringsAsFactors=FALSE)
pts <- cbind(X$Longitude, X$Latitude)
# -- This emulates arbitrary choices of origin and destination in each pair
XX <- t(combn(nrow(X), 2, function(i) c(pts[i[1],], pts[i[2],])))
k <- runif(nrow(XX)) < 1/2
XX <- rbind(XX[k, ], XX[!k, c(3,4,1,2)])
#
# Construct 4-D points for clustering.
# This is the combined array of O-D and D-O pairs, one per row.
#
Pairs <- rbind(XX, XX[, c(3,4,1,2)])
#
# Compute a distance matrix for the combined array.
#
D <- dist(Pairs)
#
# Select the smaller of each pair of possible distances and construct a new
# distance matrix for the original {O,D} pairs.
#
m <- attr(D, "Size")
delta <- matrix(NA, m, m)
delta[lower.tri(delta)] <- D
f <- matrix(NA, m/2, m/2)
block <- 1:(m/2)
f <- pmin(delta[block, block], delta[block+m/2, block])
D <- structure(f[lower.tri(f)], Size=nrow(f), Diag=FALSE, Upper=FALSE,
method="Euclidean", call=attr(D, "call"), class="dist")
#
# Cluster according to these distances.
#
H <- hclust(D)
n.groups <- 8
members <- cutree(H, k=2*n.groups)
#
# Display the clusters with colors.
#
plot(c(-131, -66), c(28, 44), xlab="Longitude", ylab="Latitude", type="n")
g <- max(members)
colors <- hsv(seq(1/6, 5/6, length.out=g), seq(1, 0.25, length.out=g), 0.6, 0.45)
colors <- colors[sample.int(g)]
invisible(sapply(1:nrow(Pairs), function(i)
lines(Pairs[i, c(1,3)], Pairs[i, c(2,4)], col=colors[members[i]], lwd=1))
)
#
# Show the points for reference
#
positions <- round(apply(t(pts) - colMeans(pts), 2,
function(x) atan2(x[2], x[1])) / (pi/2)) %% 4
positions <- c(4, 3, 2, 1)[positions+1]
points(pts, pch=19, col="Gray", xlab="X", ylab="Y")
text(pts, labels=X$Key, pos=positions, cex=0.6)