該代碼基於Pascal的代碼,刪除距離矩陣中行數最大的點。
> set.seed(310366)
> xy <- cbind(rnorm(1000),rnorm(1000))
> m1s = m1(xy,20)
> m2s = m2(xy,20)
見誰通過查看INTERPOINT距離的和做得最好:對高斯雲,其中m1
是@帕斯卡的功能
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)
}
運行
> 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](https://i.stack.imgur.com/xv0bP.png)
方法1產生的紅點,這是均勻地分佈在空間隔開。方法2創建幾乎定義周界的藍點。我懷疑這個原因很容易解決(甚至在一個維度更容易......)。
使用初始點的雙峯圖案還示出了這一點:
![enter image description here](https://i.stack.imgur.com/DsZ8p.png)
並再次方法2產生比方法1大得多的總和距離,但兩者做的比隨機抽樣更好:
> sum(dist(m1s2))
[1] 958.3518
> sum(dist(m2s2))
[1] 1206.439
> sum(dist(xy2[sample(1000,20),]))
[1] 574.34
因此,假設你有10個點,你想找到4的子集,比如說,最大化6個點間距離的總和的點? – Spacedman
是的,我認爲這將得到我正在尋找的結果... – Pascal
組合對1000點和20的子集不利。如何計算所有1000x1000距離,放下兩個最近點,重新計算距離,重複980次。比迭代10^50個組合更快。 – Spacedman