Ihre Klärung der Frage zeigt an, dass Sie möchten, dass die Gruppierung auf den tatsächlichen Liniensegmenten basiert , in dem Sinne, dass zwei beliebige Ursprungs-Ziel-Paare (OD-Paare) als "nahe" betrachtet werden sollten, wenn beide Ursprünge nahe und beide Ziele nahe sind , unabhängig davon , welchen Punkt Ursprung oder Ziel betrachtet .
Diese Formulierung deutet darauf hin, dass Sie bereits einen Eindruck von der Entfernung d zwischen zwei Punkten haben: Es kann sich um die Entfernung während des Fluges, die Entfernung auf der Karte, die Hin- und Rückfahrt oder eine andere Metrik handeln, die sich nicht ändert, wenn O und D gleich sind geschaltet. Die einzige Komplikation besteht darin, dass die Segmente keine eindeutigen Darstellungen haben: Sie entsprechen ungeordneten Paaren {O, D}, müssen jedoch als geordnete Paare (O, D) oder (D, O) dargestellt werden. Wir können daher den Abstand zwischen zwei geordneten Paaren (O1, D1) und (O2, D2) als eine symmetrische Kombination der Abstände d (O1, O2) und d (D1, D2) wie ihre Summe oder das Quadrat ansehen Wurzel aus der Summe ihrer Quadrate. Schreiben wir diese Kombination als
distance((O1,D1), (O2,D2)) = f(d(O1,O2), d(D1,D2)).
Definieren Sie einfach den Abstand zwischen ungeordneten Paaren als den kleineren der beiden möglichen Abstände:
distance({O1,D1}, {O2,D2}) = min(f(d(O1,O2)), d(D1,D2)), f(d(O1,D2), d(D1,O2))).
An dieser Stelle können Sie jede Clustering-Technik anwenden, die auf einer Distanzmatrix basiert.
Als Beispiel habe ich alle 190 Punkt-zu-Punkt-Entfernungen auf der Karte für 20 der bevölkerungsreichsten US-Städte berechnet und acht Cluster mithilfe einer hierarchischen Methode angefordert. (Der Einfachheit halber habe ich Euklidische Entfernungsberechnungen verwendet und die Standardmethoden in der von mir verwendeten Software angewendet: In der Praxis werden Sie geeignete Entfernungen und Clustering-Methoden für Ihr Problem auswählen wollen.) Hier ist die Lösung, wobei die Cluster durch die Farbe jedes Liniensegments angezeigt werden. (Die Farben wurden den Clustern zufällig zugewiesen.)
Hier ist der R
Code, der dieses Beispiel erzeugt hat. Die Eingabe erfolgt in einer Textdatei mit den Feldern "Längengrad" und "Breitengrad" für die Städte. (Um die Städte in der Abbildung zu kennzeichnen, enthält sie auch ein Feld "Schlüssel".)
#
# 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)