Làm thế nào để tìm các địa điểm trải rộng nhất?


9

Có lẽ là một câu hỏi rất đơn giản. Tôi có một danh sách khoảng một nghìn vị trí địa lý tiềm năng (lat lon) và trong số đó tôi cần chọn 200 vị trí "trải rộng nhất". Tôi nghĩ rằng đó sẽ là 200 điểm với tổng khoảng cách trung bình cao nhất. Hãy nghĩ về các cửa hàng trong một thành phố.

Có một phương pháp xác định để làm điều đó? Có lẽ trong một gói R?

Cảm ơn tất cả mọi người làm cho đây là nơi tuyệt vời để tìm hiểu nó!

/ Chris


Bạn đã tính toán một tam giác Delauney trong nghiên cứu của mình như là một tiền thân để hình dung các khu vực tối đa chưa? Có lẽ điều này sẽ giúp bạn thu hẹp lĩnh vực điều tra của bạn.

Đâ là một câu hỏi tuyệt vời. Mặc dù vậy, tôi tự hỏi, nếu tiêu đề có thể được thay đổi từ "trải ra" thành "cô lập" hoặc "từ xa". Hoặc có thể có một thuật ngữ chính thức hơn cho điều này?
Kirk Kuykendall

Câu trả lời:


10

Câu hỏi đơn giản, giải pháp khó.

Phương pháp tốt nhất mà tôi biết sử dụng mô phỏng ủ (tôi đã sử dụng phương pháp này để chọn vài chục điểm trong số hàng chục nghìn và nó có tỷ lệ cực kỳ tốt để chọn 200 điểm: tỷ lệ là tuyến tính), nhưng điều này đòi hỏi phải mã hóa cẩn thận và thử nghiệm đáng kể, như cũng như một số lượng lớn tính toán. Bạn nên bắt đầu bằng cách xem xét các phương pháp đơn giản hơn, nhanh hơn trước để xem liệu chúng có đủ không.

Một cách đầu tiên là phân cụm các vị trí cửa hàng . Trong mỗi cụm chọn cửa hàng gần trung tâm cụm nhất.

Một phương pháp phân cụm thực sự nhanh là K-nghĩa . Đây là một Rgiải pháp sử dụng nó.

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],]
}

Các đối số scatterlà một danh sách các vị trí cửa hàng (dưới dạng ma trận n theo 2) và số lượng cửa hàng sẽ chọn (ví dụ: 200). Nó trả về một loạt các vị trí.

Để làm ví dụ cho ứng dụng của nó, hãy tạo n = 1000 cửa hàng được đặt ngẫu nhiên và xem giải pháp đó trông như thế nào:

# 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))

Tính toán này mất 0,03 giây:

Nhân vật

Bạn có thể thấy nó không tuyệt vời (nhưng nó cũng không quá tệ). Để làm tốt hơn nhiều sẽ yêu cầu các phương pháp ngẫu nhiên, như ủ mô phỏng, hoặc các thuật toán có khả năng mở rộng theo cấp số nhân với quy mô của vấn đề. (Tôi đã triển khai một thuật toán như vậy: phải mất 12 giây để chọn 10 điểm cách nhau rộng rãi nhất trong số 20. Áp dụng nó cho 200 cụm là không cần thiết.)

Một thay thế tốt cho K-mean là thuật toán phân cụm theo cấp bậc; thử phương pháp "Ward's" trước và xem xét thử nghiệm với các mối liên kết khác. Điều này sẽ có nhiều tính toán hơn, nhưng chúng ta vẫn đang nói về một vài giây cho 1000 cửa hàng và 200 cụm.

Các phương pháp khác tồn tại. Chẳng hạn, bạn có thể bao phủ vùng bằng lưới lục giác thông thường và, đối với các ô có chứa một hoặc nhiều cửa hàng, hãy chọn cửa hàng gần trung tâm của nó. Chơi một chút với kích thước ô cho đến khi khoảng 200 cửa hàng đã được chọn. Điều này sẽ tạo ra một khoảng cách rất đều đặn của các cửa hàng, mà bạn có thể muốn hoặc không muốn. .


Wow, tốt và ấn tượng. Đây là một giải pháp tôi có thể sử dụng bây giờ, tôi đã học được rất nhiều, và tôi biết nên tiếp tục học ở đâu. Cảm ơn rât nhiều! Và có một ngày cuối tuần tuyệt vời!
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.