【问题标题】:How to bucket locality-sensitive hashes?如何存储局部敏感哈希?
【发布时间】:2011-09-26 06:56:43
【问题描述】:

我已经有了生成局部敏感哈希的算法,但是我应该如何存储它们以利用它们的特性(即相似的元素具有接近的哈希(具有汉明距离))?

在 matlab 代码中,我发现他们只是在要搜索的点的哈希值和数据库中点的哈希值之间创建一个距离矩阵,以简化代码,同时引用所谓的 Charikar 方法来实现真正的好实现的搜索方法。

我试图搜索它,但我不确定如何将我找到的任何方法应用于我的案例(如多探针方法)。如果您已经拥有哈希值,那么这些技术似乎都不是很容易插入的。是否有任何简单的示例代码?或者有什么建议?

这是我正在谈论的带有 matlab 代码的页面的链接: http://www.eecs.berkeley.edu/~kulis/klsh/klsh.htm

【问题讨论】:

  • 对这个问题做一些研究我想出了一个算法,它基本上包括为每个位创建表(在这种情况下)并将所有元素划分为那些设置了该位的元素和那些没有的。对所有位执行此操作。然后,在搜索时,您访问查询的每一位的正确表,这样您就可以使用所有元素来计算查询的距离(一旦您删除了重复项)。
  • 所有这一切都考虑到了一个明显的优化,也就是说,在谈到位时,它们要么是 0 要么是 1,所以你真的不需要同时列出它们(也就是说,如果你列出那些设置了位的,这意味着所有其他人都没有)。
  • 如果您的 cmets 回答了您自己的问题,您能否将它们作为答案发布并接受(我认为,两天后您可以这样做)?这样其他人可以看到问题更容易解决......
  • @user823699 你好,我看到这是一个很老的问题,但是你实现了吗?我认为您正在谈论我也在尝试实施的KLSH。我没有找到关于你在评论中描述的方法的太多信息,你能告诉我更多关于它的信息吗?
  • 我找到了算法here的实现@

标签: matlab nearest-neighbor locality-sensitive-hash


【解决方案1】:

基于:Search in locality sensitive hashing 我会这么说,读完Similarity Estimation Techniques from Rounding Algorithms

这个问题有点宽泛,所以我在这里只举一个最小(抽象)的例子:

我们的数据集中有 6 个 (= n) 向量,每个向量都有 d 位。假设我们做了 2 (= N) 随机排列。

让第一次随机排列开始!请记住,我们置换不是向量的顺序。排列位后,它们保持顺序,例如:

v1
v5
v0
v3
v2
v4

现在查询向量 q 到达,但它(几乎)不太可能与我们数据集中的向量(在排列之后)相同,因此我们赢了不通过二分查找找到它。

但是,我们最终会出现在两个向量之间。所以现在我们可以想象场景是这样的(例如q位于v0和v3之间:

v1
v5
v0 <-- up pointer
   <-- q lies here
v3 <-- down pointer
v2
v4

现在我们向上或向下移动指针,寻找与q 匹配最多位的vi 向量。假设它是 v0。

类似地,我们进行第二次置换,我们找到了向量 vi,比如说 v4。我们现在比较第一个排列的 v0 和 v4,看看哪个最接近q,即哪个与q 相等的位数最多。


但是,如果您正在寻求现成的实现,您应该在Software Recommendation 中询问。我还会查看我链接到的论文,看看作者是否公开了代码,或者他们是否愿意在与他们联系后分享代码。

【讨论】:

  • 找到算法的实现here
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 2012-10-08
  • 2011-08-11
  • 2012-12-27
  • 2015-10-10
  • 2016-09-23
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多