我已经生成了5个坐标(每个坐标由一个x和一个y变量组成,被认为是“真相”。
D <- 2 #amount of dimensions
K <- 5
events <- 2*K #number of events
truth <- matrix(data=runif(events, min = 0, max = 1), nrow=K)
然后我生成了另一组坐标,在本例中为两个:
E <- 2
test <- matrix(data=runif(2*E, min = 0, max = 1), nrow=E)
现在我想知道这五个坐标中哪一个最接近(在欧几里德意义上)这两个测试坐标中的每一个。最简单的方法是什么?
答案 0 :(得分:3)
我们可以使用包rdist
中的fields
来计算test
中每一行与truth
中每一行之间的欧几里德距离矩阵。首先是数据:
set.seed(123) ## for reproducibility
D <- 2 #amount of dimensions
K <- 5
events <- 2*K #number of events
truth <- matrix(data=runif(events, min = 0, max = 1), nrow=K)
## [,1] [,2]
##[1,] 0.2875775 0.0455565
##[2,] 0.7883051 0.5281055
##[3,] 0.4089769 0.8924190
##[4,] 0.8830174 0.5514350
##[5,] 0.9404673 0.4566147
E <- 2
test <- matrix(data=runif(2*E, min = 0, max = 1), nrow=E)
## [,1] [,2]
##[1,] 0.9568333 0.6775706
##[2,] 0.4533342 0.5726334
使用rdist
计算距离矩阵:
library(fields)
d <- rdist(test,truth)
## [,1] [,2] [,3] [,4] [,5]
##[1,] 0.9205136 0.2252589 0.5884781 0.1461471 0.2215612
##[2,] 0.5525263 0.3379176 0.3228474 0.4302058 0.5007584
要查找距离每个truth
行最近的test
行,apply
which.min
行MARGIN=1
apply(d,1,which.min)
##[1] 4 3
答案 1 :(得分:1)
如果您想避免必须计算每个行组合的距离,请避免使用基础dist
,并且在没有任何外部包的情况下执行此操作,您可以通过首先制作两个符合矩阵来手动编码欧几里德距离。
diffs <- truth[rep(1:nrow(truth), nrow(test)),] -test[rep(1:nrow(test), each=nrow(truth)),]
eucdiff <- function(x) sqrt(rowSums(x^2))
max.col(-matrix(eucdiff(diffs), nrow=nrow(test), byrow=TRUE), "first")
#[1] 4 3
使用@ aichao的数据。