如何理解局部敏感哈希?

时间:2012-10-18 10:37:48

标签: c machine-learning hashmap nearest-neighbor locality-sensitive-hash

我注意到LSH似乎是查找具有高维属性的类似项目的好方法。

在阅读了论文http://www.slaney.org/malcolm/yahoo/Slaney2008-LSHTutorial.pdf后,我仍然对这些公式感到困惑。

有没有人知道一个博客或文章解释这个简单的方法?

6 个答案:

答案 0 :(得分:242)

我在LSH中看到的最好的教程是书:大规模数据集挖掘。 检查第3章 - 查找类似项目 http://infolab.stanford.edu/~ullman/mmds/ch3a.pdf

另外,我推荐以下幻灯片: http://www.cs.jhu.edu/%7Evandurme/papers/VanDurmeLallACL10-slides.pdf。 幻灯片中的示例帮助我理解了余弦相似性的散列。

我从Benjamin Van Durme & Ashwin Lall, ACL2010借了两张幻灯片,试着解释一下LSH家族对余弦距离的直觉。 enter image description here

  • 在图中,有两个圆圈,其中红色黄色为彩色,表示两个二维数据点。我们正在尝试使用LSH找到他们的cosine similarity
  • 灰线是一些随机选取的平面。
  • 根据数据点是位于灰线的上方还是下方,我们将此关系标记为0/1。
  • 在左上角,有两排白色/黑色方块,分别代表两个数据点的签名。每个方块对应于位0(白色)或1(黑色)。
  • 因此,一旦拥有了一组平面,就可以对数据点进行编码,使其位置与平面相对应。想象一下,当我们在池中有更多的平面时,签名中编码的角度差异更接近实际差异。因为只有位于两点之间的平面才会给两个数据不同的位值。

enter image description here

  • 现在我们来看两个数据点的签名。如在示例中,我们仅使用6位(正方形)来表示每个数据。这是我们原始数据的LSH哈希值。
  • 两个散列值之间的汉明距离为1,因为它们的签名仅相差1位。
  • 考虑到签名的长度,我们可以计算出它们的角度相似度,如图所示。

我在python中有一些示例代码(仅50行),它使用余弦相似性。 https://gist.github.com/94a3d425009be0f94751

答案 1 :(得分:35)

向量空间中的推文可以是高维数据的一个很好的例子。

查看我关于将Locality Sensitive Hashing应用于推文以查找类似内容的博文。

http://micvog.com/2013/09/08/storm-first-story-detection/

因为一张图片是千言万语,请查看下图:

enter image description here http://micvog.files.wordpress.com/2013/08/lsh1.png

希望它有所帮助。 @mvogiatzis

答案 2 :(得分:21)

这是斯坦福大学的一篇演讲,解释了它。这给我带来了很大的不同。第二部分更多是关于LSH,但第一部分也包括它。

概述图片(幻灯片中还有更多内容):

enter image description here

高维数据中的近邻搜索 - 第1部分: http://www.stanford.edu/class/cs345a/slides/04-highdim.pdf

高维数据中的近邻搜索 - 第2部分: http://www.stanford.edu/class/cs345a/slides/05-LSH.pdf

答案 3 :(得分:6)

  • LSH是一个过程,它将一组文档/图像/对象作为输入,并输出一种哈希表。
  • 此表的索引包含的文档使得同一索引上的文档被视为相似,而不同索引上的文档则被视为“不相似”。
  • 类似取决于度量系统,还取决于阈值相似度 s ,其作用类似于LSH的全局参数。
  • 由您来定义适合您的问题的足够阈值 s

enter image description here

重要的是要强调不同的相似性度量具有不同的LSH实现。

在我的博客中,我试图彻底解释LSH的minHashing(jaccard相似性度量)和simHashing(余弦距离度量)的情况。希望对你有帮助: https://aerodatablog.wordpress.com/2017/11/29/locality-sensitive-hashing-lsh/

答案 4 :(得分:2)

我是一个视觉人。这对我来说是一种直觉。

假设您要搜索的每件事物都是物理对象,例如苹果,立方体,椅子。

我对LSH的直觉是它类似于拍摄这些物体的阴影。就像你拍摄3D立方体的阴影一样,你会在一张纸上得到2D方形,或者3D球体会在一张纸上看到一个像圆形的阴影。

最终,搜索问题中存在多个维度(文本中的每个单词可能都是一维),但shadow类比对我来说仍然非常有用。

现在我们可以有效地比较软件中的位串。固定长度的位串有点或多或少,就像单个维度中的线一样。

因此,对于LSH,我最终将对象的阴影投影为单个固定长度的行/位串上的点(0或1)。

整个技巧是拍摄阴影,使它们在较低维度仍然有意义,例如:它们以足够好的方式与原始物体相似,可以被识别。

透视立方体的2D绘图告诉我这是一个立方体。但是我无法在没有视角的情况下轻易区分2D正方形和3D立方体阴影:它们对我来说都看起来像一个正方形。

如何将我的物体呈现在灯光下,将决定我是否获得了一个可识别的阴影。所以我想到了一个好的" LSH是一个将我的物体转向灯光前的物体,这样它们的阴影最能被识别为代表我的物体。

所以回顾一下:我认为用LSH作为物理对象(如立方体,桌子或椅子)进行索引的东西,我将它们的阴影投影在2D中并最终沿着一条线(一个字符串)。一个好的" LSH"功能"我是如何在光线前呈现我的物体,以便在2D平地和后来的比特弦中获得近似可辨别的形状。

最后,当我想搜索我所拥有的对象是否与我索引的某些对象相似时,我会看到这个"查询"对象使用相同的方式在光源前呈现我的对象(最终也以一个字符串结束)。现在,我可以比较一下这个位字符串与我所有其他索引位字符串的相似程度,如果我找到一种很好的,可识别的方式将我的对象呈现给我的光线,那么它就是搜索我整个对象的代理。

答案 5 :(得分:0)

tldr 的答案很简短:

对位置敏感的哈希的示例可能是:首先在要输入的哈希空间中随机设置平面(具有旋转和偏移),然后在该空间中将点放到哈希中,然后针对每个平面测量该点在其上方或下方(例如:0或1),答案是哈希。因此,如果使用前后的余弦距离来测量,相似的空间点将具有相似的哈希值。

您可以使用scikit-learn阅读此示例:https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer