为什么scipy'cKDTree'慢于'cdist'来找到最近的点?

在许多参考文献中都告诉我,KDTree是查找大数据的最近邻居的快速方法。我当前的问题是找到给定数据A的X中最接近的点。 详细地说,当前X具有1,000,000个数字数据,而A由10,000组成。我想找到A中每个点在X中最接近的点。因此,结果应该是10,000个索引,指示X中的数据点。

当我将cdist(来自scipy.spatial)与for循环配合使用以查找A中每个数据的最近点时,它花费了大约半小时(1972秒),而cKDTree.query花费了大约50分钟(2839秒)使用n_jobs = 4时。

cdist的代码如下:

t = time.time() 
nn = np.array([])
jump = 1000
nloop = np.ceil(A.shape[0]/jump).astype(int)
for ii in range(nloop):
   temp = cdist(X,A[ii*jump:(ii+1)*jump])
   nn = np.append(nn,np.argmin(temp,axis = 0))
print('Elapsed time: ',time.time() - t) # this was 1926 seconds (a little bit faster than one by one loop)

cKDTree的代码如下:

t = time.time()
tree = cKDTree(X)
nn = tree.query(A,1,n_jobs = 4)[1]
print('Elapsed time: ',time.time() - t) # this is 2839 seconds
  1. 我很好奇这是否正常,
  2. 如果在通过计算距离来查找最近的邻居时cdist实际上更快,在什么情况下应使用cKDTree?如果我使用大得多的数据集A,KDTree应该更好吗?
  3. 是否只有在查询最近点(k = 1)时才计算索引而不计算距离?我的猜测是,距离计算会使速度大大降低(当然,这只是猜测)
fk16v 回答:为什么scipy'cKDTree'慢于'cdist'来找到最近的点?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3061353.html

大家都在问