아마도 매우 간단한 질문 일 것입니다. 약 1,000 개의 잠재적 인 지리적 위치 (위도)와 "가장 널리 퍼져있는"200 개의 위치를 선택해야하는 목록이 있습니다. 총 평균 거리가 가장 높은 200 점이라고 생각합니다. 도시에있는 상점을 생각하십시오.
정의 된 방법이 있습니까? 아마도 R 패키지에 있습니까?
배우기 좋은 곳으로 만드는 모든 분들께 감사드립니다!
/ 크리스
아마도 매우 간단한 질문 일 것입니다. 약 1,000 개의 잠재적 인 지리적 위치 (위도)와 "가장 널리 퍼져있는"200 개의 위치를 선택해야하는 목록이 있습니다. 총 평균 거리가 가장 높은 200 점이라고 생각합니다. 도시에있는 상점을 생각하십시오.
정의 된 방법이 있습니까? 아마도 R 패키지에 있습니까?
배우기 좋은 곳으로 만드는 모든 분들께 감사드립니다!
/ 크리스
답변:
간단한 질문, 어려운 해결책.
내가 아는 가장 좋은 방법은 시뮬레이션 어닐링을 사용합니다 (수십만 점 중 수십 점을 선택하는 데 사용했으며 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 개의 매장이 선택 될 때까지 셀 라이즈로 조금 놀아보십시오. 이것은 당신이 원하거나 원하지 않는 매우 일정한 상점 간격을 생성합니다. (이것이 실제로 매장 위치 인 경우, 인구가 가장 적은 지역에서 매장을 선택하는 경향이 있기 때문에 이것은 나쁜 해결책 일 것입니다. 다른 응용 프로그램에서는 훨씬 더 나은 솔루션 일 수 있습니다.)