该代码基于 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)
方法 1 生成红点,这些点在空间上均匀分布。方法 2 创建几乎定义周长的蓝点。我怀疑其原因很容易解决(在一个维度上更容易......)。
使用初始点的双峰模式也说明了这一点:
同样,方法 2 产生的总和距离比方法 1 大得多,但两者都比随机采样更好:
> sum(dist(m1s2))
[1] 958.3518
> sum(dist(m2s2))
[1] 1206.439
> sum(dist(xy2[sample(1000,20),]))
[1] 574.34