가장 널리 퍼진 위치를 찾는 방법은 무엇입니까?


9

아마도 매우 간단한 질문 일 것입니다. 약 1,000 개의 잠재적 인 지리적 위치 (위도)와 "가장 널리 퍼져있는"200 개의 위치를 ​​선택해야하는 목록이 있습니다. 총 평균 거리가 가장 높은 200 점이라고 생각합니다. 도시에있는 상점을 생각하십시오.

정의 된 방법이 있습니까? 아마도 R 패키지에 있습니까?

배우기 좋은 곳으로 만드는 모든 분들께 감사드립니다!

/ 크리스


연구의들 로니 삼각 분할 (Delauney Triangulation)이 최대 영역을 시각화하기위한 선구자라고 계산 했습니까? 아마도 이것은 당신이 조사 분야를 좁히는 데 도움이 될 것입니다.

이것은 좋은 질문입니다. 제목이 "확산"에서 "절연"또는 "원격"으로 변경 될 수 있는지 궁금합니다. 아니면 더 공식적인 용어가 있습니까?
Kirk Kuykendall

답변:


10

간단한 질문, 어려운 해결책.

내가 아는 가장 좋은 방법은 시뮬레이션 어닐링을 사용합니다 (수십만 점 중 수십 점을 선택하는 데 사용했으며 200 점을 선택하는 데 매우 적합합니다. 크기 조정은 하위 선형 임). 엄청난 양의 계산. 더 간단하고 빠른 방법을 먼저 살펴보고 그것이 충분한 지 확인해야합니다.

한 가지 방법은 먼저 상점 위치클러스터하는 것 입니다. 각 클러스터 내에서 클러스터 센터에 가장 가까운 상점을 선택하십시오.

정말 빠른 클러스터링 방법은 K-means 입니다. 여기에 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는 상점 위치 ( n x 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-means의 좋은 대안은 계층 적 군집 알고리즘입니다. "Ward 's"방법을 먼저 시도하고 다른 연계를 실험 해보십시오. 더 많은 계산이 필요하지만 1000 개의 상점과 200 개의 클러스터에 대해 몇 초 정도 이야기하고 있습니다.

다른 방법이 존재합니다. 예를 들어, 6 각형 격자로 영역을 덮고 하나 이상의 상점을 포함하는 셀의 경우 중앙에서 가장 가까운 상점을 선택하십시오. 약 200 개의 매장이 선택 될 때까지 셀 라이즈로 조금 놀아보십시오. 이것은 당신이 원하거나 원하지 않는 매우 일정한 상점 간격을 생성합니다. (이것이 실제로 매장 위치 인 경우, 인구가 가장 적은 지역에서 매장을 선택하는 경향이 있기 때문에 이것은 나쁜 해결책 일 것입니다. 다른 응용 프로그램에서는 훨씬 더 나은 솔루션 일 수 있습니다.)


와우, 훌륭하고 인상적입니다. 이것은 지금 사용할 수있는 솔루션이며 많은 것을 배웠으며 계속 공부할 곳을 알고 있습니다. 대단히 감사합니다! 즐거운 주말 보내세요!
Chris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.