Python 稀疏矩阵的高效最近邻搜索

Python 稀疏矩阵的高效最近邻搜索,python,scipy,scikit-learn,nearest-neighbor,Python,Scipy,Scikit Learn,Nearest Neighbor,我有大量的数据(文本),我已将其转换为稀疏术语文档矩阵(我正在使用scipy.sparse.csr.csr\u矩阵存储稀疏矩阵)。我想为每个文档查找前n个最近邻匹配项。我希望pythonscikit-learn库中的NearestNeighbor例程(sklearn.NearestNeighbor.NearestNeighbor)能解决我的问题,但使用空间分区数据结构的高效算法,如KD-trees或Ball-trees不能处理稀疏矩阵。只有蛮力算法适用于稀疏矩阵(在我的例子中,这是不可行的,因为

我有大量的数据(文本),我已将其转换为稀疏术语文档矩阵(我正在使用
scipy.sparse.csr.csr\u矩阵
存储稀疏矩阵)。我想为每个文档查找前n个最近邻匹配项。我希望
pythonscikit-learn
库中的
NearestNeighbor
例程(
sklearn.NearestNeighbor.NearestNeighbor
)能解决我的问题,但使用空间分区数据结构的高效算法,如
KD-trees
Ball-trees
不能处理稀疏矩阵。只有蛮力算法适用于稀疏矩阵(在我的例子中,这是不可行的,因为我处理的是大型语料库)

对于稀疏矩阵的最近邻搜索是否有任何有效的实现(在Python或任何其他语言中)


谢谢。

您可以尝试使用TruncatedSVD将高维稀疏数据转换为低维密集数据,然后创建球树。

后期回答:看一看


已提议并支持scikit学习

您确定球树将与SVD输出一起正常工作吗?通常对于文本数据,您希望SVD保持大约100-200个维度……我可以确认LSHForest正在工作,并且在2016年也支持稀疏矩阵输入,这非常好。缺点是这个实现的速度惊人地慢,可能需要一个版本2,尽管版本1的输出看起来至少是正确的。为了提高速度,我正在尝试BallTree并首先使用SVD来降低维数,就像Mathieu建议的那样,以支持BallTree的密集矩阵要求。SVD还可以帮助我找到潜在的特征,以帮助使用DBSCAN进行聚类。最后,余弦距离度量是LSHForest唯一的距离度量,它适用于许多数据,但并非所有数据。