我正在建立一种推荐系统,该系统具有一种查找与给定项目最相似的项目的方法。
为此,我可以使用项目在特征空间中的嵌入,然后使用scikit-learn NearestNeighbors class进行最近邻搜索。但是,我也可以计算所有成对的点之间的距离,并将其存储在形状为np.ndarray
的{{1}}中,然后使用np.argsort
来查找前k个索引(因此,相似的项目)。
其中哪些替代品可以更快找到最相似的商品?
编辑:我说的是大型项目
谢谢!
答案 0 :(得分:0)
通常,对数组进行排序将比像最近的邻居分类器之类的学习模型更适合计算。但是,如果您只需要在开始时一次拟合模型,则可能会获得运行时优势。
使用Numpy排序数组的最佳时间复杂度为O(nlogn)。如果您每次都要查找都必须进行排序,则可能效率不高。您可以配置scikit-learn的NearestNeighbors类使用的KDTree algorithm可以在O(nlogn)的时间内构造,然后可以在O(logn)的时间内执行查找。因此,如果您只需要在开始时构建一次KDTree,则效率可能更高。请注意,搜索必须计算距特征向量的距离,因此,如果特征空间是高维的,则最终效率可能会降低。而且,如果您永远不会遇到看不见的数据点,那可能是完全浪费的。
您在此做出的决定可能应该专注于使用而不是效率。如果您必须对全新的,从未见过的数据点进行分类,则最邻近的分类器通常很有用。如果您已经将系统中遇到的每个数据点的所有距离都存储在表中,则学习的分类器可能无济于事,因为您可以简单地在表中查找该点或构建搜索树以从列表中访问这些点。您已经拥有的距离。但是,如果您的系统遇到表格中没有的数据,则可以使用表格作为训练数据来训练分类器,例如允许模型估算您没有的距离。
请注意,最近邻居分类器并不是唯一可用于对看不见的数据点进行分类的模型类型,并且所有分类器都需要考虑利弊。但是首先重要的是,确定一个学到的模型对于您的应用程序是否有意义。
与往常一样,在处理速度问题时,重要的是实现和描述您的选项。