[英]how to find the nearest neighbor of a sparse vector
我有大约500个向量,每个向量都是1500维向量,并且几乎每个向量都非常稀疏-我的意思是向量的大约30-70维不为0。
现在,问题是这是给定的向量,也是1500维,我需要将其与500个向量进行比较,以找出500个向量中最接近的一个(以欧氏距离表示)。
毫无疑问,蛮力法是一种解决方案,但是我需要计算500次的距离,这需要很长时间。
昨天我读了一篇文章“具有大词汇量和快速空间匹配的对象检索”,它说使用倒排索引会有所帮助,它说:
但是经过我的测试,几乎没有任何意义,可以想象一个1500矢量,其中50维的尺寸不为零,当涉及到另一个矢量时,它们可能始终具有相同的维数,而不为零。 换句话说,这种算法只能排除一些向量,我仍然需要与剩下的许多向量进行比较。
谢谢您阅读本文的帮助,我的问题是:
1.这种算法有意义吗?
2.还有其他方法可以做我想做的事吗? 例如flann或Kd-TREE? 但我想要确切准确的最近邻居,一个大约一个是不够的
这种索引称为倒排列表 ,通常用于文本。
例如,Apache Lucene使用这种索引进行文本相似性搜索。
本质上,您使用列式布局,并且仅存储非零值。 为了提高磁盘效率,可以使用各种压缩技术。
然后,您可以使用这些列表上的set操作来计算许多相似度。
kd-trees不能在这里使用。 如果您有许多重复的(零)值,它们将效率极低。
我不知道您的情况,但是如果您不关心冗长的预处理步骤,并且必须经常且快速地进行此检查,则可以构建邻域图并按距离对邻居进行排序。
为了有效地构建此图,您可以执行出租车距离或平方距离,以按距离对点进行排序(这将避免繁重的计算)。
然后,如果您想要最近的邻居,则只需选择第一个邻居即可:p。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.