如何找到稀疏向量的最近邻居

时间:2016-01-05 12:07:01

标签: algorithm vector machine-learning information-retrieval

我有大约500个向量,每个向量是1500维向量, 并且几乎每个矢量都非常稀疏 - 我的意思是只有约30-70维的矢量不是0。

现在,问题在于这里是一个给定的矢量,也是1500维,我需要将它与500个矢量进行比较,以找出500中哪一个是最近的一个。(在欧几里德距离内)。

毫无疑问,蛮力方法是一种解决方案,但我需要计算500次距离,这需要很长时间。

昨天我读了一篇文章"用大词汇表和快速空间匹配对象检索",它说使用倒排索引会有所帮助,它说: enter image description here

但是在我的测试之后,它几乎没有任何意义,想象一个1500向量,其中50个维度不为零,当涉及到另一个时,它们可能总是具有不为零的相同维度。换句话说,这个算法只能排除一些小向量,我仍然需要与剩下的很多向量进行比较。

感谢您在这里读到的很好,我的问题是:

1.这个算法会有意义吗?

2.还有其他办法可以做我想做的事吗?如flann或Kd-TREE? 但我想要精确准确的最近邻居,大约一个是不够的

2 个答案:

答案 0 :(得分:1)

这种索引称为倒排列表,通常用于文本。

例如,Apache Lucene使用这种索引进行文本相似性搜索。

基本上,您使用柱状布局,并且只存储非零值。对于磁盘效率,可以采用各种压缩技术。

然后,您可以使用这些列表上的集合操作来计算许多相似之处。

k-d-trees不能在这里使用。如果你有许多重复(零)值,它们的效率会非常低。

答案 1 :(得分:0)

我不知道您的上下文,但如果您不需要长时间的预处理步骤而且必须经常快速地进行此检查,则可以构建邻域图并按距离对邻居进行排序。

要有效地构建此图表,您可以执行出租车距离或方形距离,以按距离对点进行排序(这样可以避免繁重的计算)。

然后,如果你想要最近的邻居,你只需要选择第一个邻居:p。