【发布时间】:2015-04-16 19:59:24
【问题描述】:
我正在使用 kd-tree 算法 (found here) 来查找矩阵 1 中一个点相对于矩阵 2 中所有点的最近邻。上面链接的算法非常快,能够找到最近的 3E6邻居在大约 20 秒内使用
nn2(SetA,SetB,k=1)
现在,我只想包括彼此一定半径内的最近邻居,所以我尝试了
nn2(SetA,SetB,k=1,searchtype='radius',radius=1000)
效果很好,但令人难以置信地减慢了计算速度,实际上是数量级(1000 倍或更多)。我不明白为什么会发生这种情况,因为我认为最大半径实际上应该减少计算时间,因为不必扫描整个空间。
有人能解释一下出了什么问题吗?或者为什么这是预期的行为?
重现行为的示例代码
library(data.table)
library(RANN)
N=50000
DT1=data.table(x=sample(0:300,N,replace=T),y=sample(301:600,N,replace=T))
DT2=data.table(x=sample(0:300,N,replace=T),y=sample(301:600,N,replace=T))
ptm=proc.time()
nnlistV1=nn2(DT1,DT2,k=1)
proc.time()-ptm
ptm=proc.time()
nnlistV2=nn2(DT1,DT2,k=1,searchtype="radius",radius=20)
proc.time()-ptm
【问题讨论】:
-
听起来很奇怪。 libnabo 呢?
-
听起来好像正在进行数据转换或
nn2使用的算法效率不高。我的建议是查看源文件rbind.R,其中定义了nn2,并进行复杂性分析。 -
生成与真实数据集相似的数据集的代码会很有帮助。
-
@ARobertson 好点,我刚刚添加了重现行为的代码