Klarifikasi pertanyaan Anda menunjukkan bahwa Anda ingin pengelompokan didasarkan pada segmen garis yang sebenarnya , dalam arti bahwa dua pasangan asal-tujuan (OD) harus dianggap "dekat" ketika salah satu dari kedua asal dekat dan kedua tujuan dekat. , terlepas dari titik mana yang dianggap asal atau tujuan .
Formulasi ini menunjukkan Anda sudah memiliki rasa jarak d antara dua titik: itu bisa berupa jarak ketika pesawat terbang, jarak pada peta, waktu perjalanan pulang pergi, atau metrik lain yang tidak berubah ketika O dan D sedang diaktifkan. Satu-satunya komplikasi adalah bahwa segmen tidak memiliki representasi unik: mereka sesuai dengan pasangan tidak berurutan {O, D} tetapi harus direpresentasikan sebagai pasangan berurutan , baik (O, D) atau (D, O). Karena itu, kita dapat mengambil jarak antara dua pasangan berurutan (O1, D1) dan (O2, D2) menjadi beberapa kombinasi simetris dari jarak d (O1, O2) dan d (D1, D2), seperti jumlah atau kuadratnya akar jumlah kotak mereka. Mari kita tuliskan kombinasi ini sebagai
distance((O1,D1), (O2,D2)) = f(d(O1,O2), d(D1,D2)).
Cukup tentukan jarak antara pasangan tak berurutan menjadi yang lebih kecil dari dua jarak yang mungkin:
distance({O1,D1}, {O2,D2}) = min(f(d(O1,O2)), d(D1,D2)), f(d(O1,D2), d(D1,O2))).
Pada titik ini Anda dapat menerapkan teknik pengelompokan apa pun berdasarkan matriks jarak.
Sebagai contoh, saya menghitung semua 190 jarak point-to-point di peta untuk 20 kota paling padat di AS dan meminta delapan cluster menggunakan metode hierarkis. (Untuk kesederhanaan saya menggunakan perhitungan jarak Euclidean dan menerapkan metode default pada perangkat lunak yang saya gunakan: dalam praktiknya Anda akan ingin memilih jarak yang tepat dan metode pengelompokan untuk masalah Anda). Inilah solusinya, dengan kluster yang ditunjukkan oleh warna setiap segmen garis. (Warna ditugaskan secara acak ke kluster.)
Berikut adalah R
kode yang menghasilkan contoh ini. Inputnya adalah file teks dengan bidang "Longitude" dan "Latitude" untuk kota-kota. (Untuk memberi label kota-kota pada gambar, itu juga termasuk bidang "Kunci".)
#
# 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)