numpy argsort 与 sklearn NearestNeighbors

numpy argsort vs sklearn NearestNeighbors

我正在构建一个推荐系统,该系统使用一种方法来查找与给定项目最相似的项目。

为此,我可以使用特征 space 中的项目嵌入,然后使用 scikit-learn NearestNeighbors class. However, I could also compute the distance between all pairs of points and store it in a np.ndarray of shape n_items, n_items and use np.argsort 应用最近邻搜索来查找前 k 个索引(因此最相似项目的索引).

在找到最相似的项目时,这些备选方案中的哪一个应该更快?

编辑:我说的是大量物品

谢谢!

一般来说,对数组进行排序比拟合学习模型(如最近邻 classifier)的计算效率更高。但是,如果您只需要在开始时拟合一次模型,您可能会获得运行时优势。

使用 Numpy 对数组进行排序的最佳时间复杂度为 O(nlogn)。如果每次查找都必须排序,这可能效率低下。您可以配置 scikit-learn 的 NearestNeighbors class 使用的 KDTree algorithm 可以在 O(nlogn) 的时间内构造,然后可以在 O(logn) 的时间内执行查找。所以如果一开始只需要构建一次KDTree,可能效率会更高。请注意,搜索必须计算与您的特征向量的距离,因此如果您的特征 space 是高维的,这最终可能会降低效率。如果您永远不会遇到看不见的数据点,那可能完全是浪费。

您在这里的决定可能应该侧重于使用而不是效率。如果您必须 classify 全新的、前所未见的数据点,那么最近的邻居 classifier 通常很有用。如果您已经将系统将遇到的每个数据点的所有距离都存储在 table 中,那么学习 classifier 可能对您没有帮助,因为您可以简单地在 [=23] 中查找该点=] 或构建一个搜索树以从您已有的距离访问这些点。但是,如果您的系统会遇到 table 中没有的数据,您可以使用 table 作为训练数据来训练 classifier,例如允许模型估计您没有的距离。

请注意,最近邻 classifier 并不是唯一一种可用于 classify 看不见的数据点的模型类型,所有 classifier 都有利有弊考虑。但首先更重要的是确定学习的模型是否对您的应用有意义。

和往常一样,在处理速度问题时,实施和分析您的选择很重要。