选择R中最远的n个点

时间:2014-03-03 16:52:06

标签: r distance

给定一组xy坐标,如何选择n个点,使得这些n个点彼此距离最近?

对于大数据集可能效果不佳的低效方法如下(确定1000个最远的20个点):

xy <- cbind(rnorm(1000),rnorm(1000))

n <- 20
bestavg <- 0
bestSet <- NA
for (i in 1:1000){
    subset <- xy[sample(1:nrow(xy),n),]
    avg <- mean(dist(subset))
    if (avg > bestavg) {
        bestavg <- avg
        bestSet <- subset
    }
}

2 个答案:

答案 0 :(得分:9)

此代码基于Pascal的代码,删除了距离矩阵中具有最大行和的点。

m2 <- function(xy, n){

    subset <- xy

    alldist <- as.matrix(dist(subset))

    while (nrow(subset) > n) {
        cdists = rowSums(alldist)
        closest <- which(cdists == min(cdists))[1]
        subset <- subset[-closest,]
        alldist <- alldist[-closest,-closest]
    }
    return(subset)
}

在高斯云上运行,其中m1是@ pascal的函数:

> set.seed(310366)
> xy <- cbind(rnorm(1000),rnorm(1000))
> m1s = m1(xy,20)
> m2s = m2(xy,20)

通过查看点间距离的总和来查看谁做得最好:

> sum(dist(m1s))
[1] 646.0357
> sum(dist(m2s))
[1] 811.7975

方法2获胜!并与随机抽样的20分进行比较:

> sum(dist(xy[sample(1000,20),]))
[1] 349.3905

预期效果非常差。

那是怎么回事?我们的情节是:

> plot(xy,asp=1)
> points(m2s,col="blue",pch=19)
> points(m1s,col="red",pch=19,cex=0.8)

enter image description here

方法1生成红点,这些红点在空间上均匀分布。方法2创建蓝点,几乎定义周长。我怀疑这个原因很容易解决(在一个方面更容易......)。

使用双峰模式的初始点也说明了这一点:

enter image description here

并且方法2再次产生比方法1大得多的总和距离,但两者都比随机采样更好:

> sum(dist(m1s2))
[1] 958.3518
> sum(dist(m2s2))
[1] 1206.439
> sum(dist(xy2[sample(1000,20),]))
[1] 574.34

答案 1 :(得分:0)

根据@Spacedman的建议,我写了一个函数,从最近的一对中删除一个点,直到剩下所需的点数。它似乎运行良好,但是,当你添加点时它会很快变慢。

xy <- cbind(rnorm(1000),rnorm(1000))

n <- 20

subset <- xy

alldist <- as.matrix(dist(subset))
diag(alldist) <- NA
alldist[upper.tri(alldist)] <- NA

while (nrow(subset) > n) {
    closest <- which(alldist == min(alldist,na.rm=T),arr.ind=T)
    subset <- subset[-closest[1,1],]
    alldist <- alldist[-closest[1,1],-closest[1,1]]
}