提问人:TN530 提问时间:8/23/2023 最后编辑:Matt HallTN530 更新时间:8/24/2023 访问量:34
SKCnlearn 最近邻运行时:构造与查找
sklearn nearest neighbor runtime: construction vs lookup
问:
假设我有一个大小约为 4000 x 10 的 2D numpy 数组。假设我将每一行视为 10 维空间中的一个点,并希望计算每个点的 5 个最近邻。我运行了以下代码。
import numpy as np
from sklearn.neighbors import NearestNeighbors
import time
A = np.random.rand(4000, 10)
t1 = time.time()
nbrs = NearestNeighbors(n_neighbors = 5, algorithm = 'kd_tree').fit(A)
t2 = time.time()
distance, indices = nbrs.kneighbors(A)
t3 = time.time()
print('time taken for step1: fitting is:', t2 - t1)
print('time taken for step2: retrieving data is:', t3 - t2)
结果是
time taken for step1: fitting is: 0.009654521942138672
time taken for step2: retrieving data is: 0.3108406066894531
我的第一个问题:为什么获得距离/索引数组所需的时间比拟合要长得多。根据我的理解,拟合是构建模型的过程(计算距离,对计算出的距离进行排序),而获取距离/索引只是从模型中读取数据。与我的直觉完全相反,第 2 步需要更多的时间。我的哪一部分理解不正确?
我的第二个问题是,如果我只想要模型中的索引,即对于每个点,最接近的 5 个点的索引,而不是距离,有什么方法可以使第 2 步更快?
答:
1赞
Matt Hall
8/24/2023
#1
我觉得你的理解不太对。构造与查找的相对速度取决于算法。关于你对 K-D 树的选择(我的强调),文档是这样说的:
KD 树的构造速度非常快:由于分区仅沿数据轴执行,因此无需计算 D 维距离。构造完成后,只需 O[log(N)] 距离计算即可确定查询点的最近邻 [查找]。尽管 KD 树方法对于低维 (D < 20) 邻居搜索非常快,但随着 D 变得非常大,它变得效率低下
评论
0赞
TN530
8/25/2023
谢谢!我错过了文档中的那部分。
评论