背景:我有一个机器学习模型,给定一个对象会返回一个维度为d的嵌入向量,该模型是按照语义相似性训练的,使得两个嵌入向量的语义相似性非常接近。现在,验证过程相对简单,我可以像比较两个向量的余弦相似度这样做。对于识别来说,稍微有点复杂,我可以循环遍历所有锚点文档并比较余弦相似度,或者使用类似kNN(在线)的方法。
问题:我有一个嵌入向量列表,每个向量都具有长度为N的维度d的浮点数据。
什么样的高效的数据结构和算法能够实现以下操作:
- 能够高效地(<= 对数复杂度)向列表中添加一个带有唯一ID的新向量
- 能够高效地(希望是<= 对数复杂度)搜索列表中的任意向量,并检索出与它们曼哈顿距离/L1范数最小的前k个向量。
例子:
[
[1., 2., 3.],
[5., 6., 8.],
[-11., 2., 31.]
]
k = 2
查询 = [1.5、2.5、3.2]
结果:
[
[1., 2., 3.],
[5., 6., 8.],
]