Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的点数据集中选择n个分布最均匀的点_R_Distance - Fatal编程技术网

在R中的点数据集中选择n个分布最均匀的点

在R中的点数据集中选择n个分布最均匀的点,r,distance,R,Distance,给定一组点,我试图选择n个点的子集,这些点在这组点上分布最均匀。换句话说,我试图精简数据集,同时仍然在空间中均匀采样 到目前为止,我有以下几点,但这种方法可能无法很好地处理较大的数据集。也许有一种更智能的方法可以首先选择点的子集。。。 下面的代码随机选择一个子集的点,并试图最小化该子集中的点与该子集中以外的点之间的距离 感谢您的建议 evenSubset <- function(xy, n) { bestdist <- NA bestSet <- NA

给定一组点,我试图选择n个点的子集,这些点在这组点上分布最均匀。换句话说,我试图精简数据集,同时仍然在空间中均匀采样

到目前为止,我有以下几点,但这种方法可能无法很好地处理较大的数据集。也许有一种更智能的方法可以首先选择点的子集。。。 下面的代码随机选择一个子集的点,并试图最小化该子集中的点与该子集中以外的点之间的距离

感谢您的建议

evenSubset <- function(xy, n) {

    bestdist <- NA
    bestSet <- NA
    alldist <- as.matrix(dist(xy))
    diag(alldist) <- NA
    alldist[upper.tri(alldist)] <- NA
    for (i in 1:1000){
        subset <- sample(1:nrow(xy),n)
        subdists <- alldist[subset,-subset]
        distsum <- sum(subdists,na.rm=T)
        if (distsum < bestdist | is.na(bestdist)) {
            bestdist <- distsum
            bestSet <- subset
        }
    }
    return(xy[bestSet,])
}

xy2 <- evenSubset(xy=cbind(rnorm(1000),rnorm(1000)), n=20)
plot(xy)
points(xy2,col='blue',cex=1.5,pch=20)

evenSubset根据@Spacedman的建议,我使用voronoi tesselation来识别并删除那些最接近其他点的点

这里,要下降的点数百分比被赋予函数。这似乎工作得很好,只是对于大型数据集来说速度较慢

library(tripack)
voronoiFilter <- function(occ,drop) {
    n <- round(x=(nrow(occ) * drop),digits=0)
    subset <- occ
    dropped <- vector()
    for (i in 1:n) {
        v <- voronoi.mosaic(x=subset[,'Longitude'],y=subset[,'Latitude'],duplicate='error')
        info <- cells(v)
        areas <- unlist(lapply(info,function(x) x$area))
        smallest <- which(areas == min(areas,na.rm=TRUE))
        dropped <- c(dropped,which(paste(occ[,'Longitude'],occ[,'Latitude'],sep='_') == paste(subset[smallest,'Longitude'],subset[smallest,'Latitude'],sep='_')))
        subset <- subset[-smallest,]
    }
    return(occ[-dropped,])
}

xy <- cbind(rnorm(500),rnorm(500))
colnames(xy) <- c('Longitude','Latitude')
xy2 <- voronoiFilter(xy, drop=0.7)

plot(xy)
points(xy2,col='blue',cex=1.5,pch=20)
库(tripack)

voronoiFilter如果您只关心子集S的扩散均匀性,那么您可以独立于剩余的点集来做这件事。您希望最小化空空间最近邻函数(即从任意位置到S中最近点的距离)。您可以通过构造voronoi细分并迭代删除最小面积多边形来实现这一点。这将很像另一个问题中最接近的配对丢弃算法。。。