질문을 명확하게 설명 하면 두 출발지와 목적지가 모두 가까울 때 두 원점 목적지 (OD) 쌍을 "닫기"로 간주해야한다는 점에서 클러스터링이 실제 선분을 기반으로하고 싶다는 것을 나타냅니다. , 상관없이 포인트는 원점 또는 목적지 여겨진다 .
이 공식은 두 점 사이 의 거리 d 를 이미 알고 있음을 나타 냅니다. 비행기가 날아가는 거리,지도상의 거리, 왕복 이동 시간 또는 O와 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 개의 지점 간 거리를 모두 계산하고 계층 적 방법을 사용하여 8 개의 클러스터를 요청했습니다. (간단하게하기 위해 유클리드 거리 계산을 사용하고 내가 사용하고있는 소프트웨어에서 기본 방법을 적용했습니다. 실제로 문제에 적합한 거리와 클러스터링 방법을 선택하고 싶을 것입니다). 다음은 각 선분의 색상으로 클러스터가 표시된 솔루션입니다. (색상은 클러스터에 무작위로 할당되었습니다.)
다음은 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)