Algorithm 用O(log(n))实现最近向量搜索算法 假设有n个文档表示为单位向量,称之为X 我有一个文档的向量表示,称之为席。 Li >如何找到X席到XI的最接近的*向量(无线性搜索)?< /LI>

Algorithm 用O(log(n))实现最近向量搜索算法 假设有n个文档表示为单位向量,称之为X 我有一个文档的向量表示,称之为席。 Li >如何找到X席到XI的最接近的*向量(无线性搜索)?< /LI>,algorithm,math,search,nlp,Algorithm,Math,Search,Nlp,*距离可以是L2;当我们谈论单位向量时,比例等于余弦相似性 我的近似方法(恒定时间): 1.对每个向量维度的所有文档进行排序。 2.使用排序索引仅对数据子集进行暴力:f.e.包括每个向量维度的所有最近的1000个文档,暴力通过所有(或大多数)维度中显示接近的文档(1000)计算L2距离。(最多1000) 然而,我想知道是否有一个“更干净”的精确解,比如最近点对问题的分治算法,它在对数(n)时间内运行 PS:内存也应该线性扩展。但这应该没问题 示例:我将1M文档的100维向量表示存储为32位浮点

*距离可以是L2;当我们谈论单位向量时,比例等于余弦相似性

我的近似方法(恒定时间): 1.对每个向量维度的所有文档进行排序。 2.使用排序索引仅对数据子集进行暴力:f.e.包括每个向量维度的所有最近的1000个文档,暴力通过所有(或大多数)维度中显示接近的文档(1000)计算L2距离。(最多1000)

然而,我想知道是否有一个“更干净”的精确解,比如最近点对问题的分治算法,它在对数(n)时间内运行

PS:内存也应该线性扩展。但这应该没问题

示例:我将1M文档的100维向量表示存储为32位浮点

  • 矢量表示:1M*100 dims*32bit=3.2Gbit=400MB
  • 排序索引:1M*100排序*32bit=3.2Gbit=400MB

据我所知,没有算法能在O(logn)最坏情况下工作。然而,对于更多或更少的随机分布点,有一些精确的空间划分方法,它们以O(logn)平均值工作。如果您的文档集X是不可变的,则可以使用。如果您需要支持修改,您应该尝试,这要复杂得多,但支持对X的插入和删除,而且它具有更一致的查询时间(但仍然平均到O(logn))。这两种结构都使用线性空间。

回答我自己的问题:

到目前为止,我找到的最佳解决方案是Spotify的近似最近邻搜索(哦,是的):


除此之外,sklearn还提供了一些快速近似近邻搜索功能

这回答了你的问题吗?