如何理解局部敏感哈希? [关闭]
Posted
技术标签:
【中文标题】如何理解局部敏感哈希? [关闭]【英文标题】:How to understand Locality Sensitive Hashing? [closed] 【发布时间】:2012-10-08 19:08:46 【问题描述】:我注意到 LSH 似乎是查找具有高维度属性的类似项目的好方法。
阅读http://www.slaney.org/malcolm/yahoo/Slaney2008-LSHTutorial.pdf的论文后,我仍然对那些公式感到困惑。
有没有人知道解释这个简单方法的博客或文章?
【问题讨论】:
阅读 Ullman 第 3 章 - “寻找相似物品”infolab.stanford.edu/~ullman/mmds.html 我投票结束这个问题是因为Machine learning (ML) theory questions are off-topic on Stack Overflow - gift-wrap candidate for Cross-Validated 【参考方案1】:作为一个非常简短的 tldr 答案:
局部敏感散列的一个示例可能是首先在您的输入空间中随机设置平面(带有旋转和偏移)以进行散列,然后将您的点放到该空间中的散列中,并为每个平面测量是否点在它的上方或下方(例如:0 或 1),答案是哈希。因此,如果用之前或之后的余弦距离测量,空间中相似的点将具有相似的哈希值。
您可以使用 scikit-learn 阅读此示例:https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer
【讨论】:
【参考方案2】: LSH 是将一组文档/图像/对象作为输入并输出一种哈希表的过程。 此表的索引包含文档,相同索引上的文档被视为相似,不同索引上的文档被视为“不相似”。 其中 similar 取决于度量系统以及阈值相似度 s,其作用类似于 LSH 的全局参数。 由您来定义适合您的问题的阈值 s。重要的是要强调不同的相似性度量有不同的 LSH 实现。
在我的博客中,我尝试对 minHashing(jaccard 相似性度量)和 simHashing(余弦距离度量)的情况进行彻底的 LSH 解释。希望对你有帮助: https://aerodatablog.wordpress.com/2017/11/29/locality-sensitive-hashing-lsh/
【讨论】:
【参考方案3】:我是一个视觉型的人。这就是我的直觉。
假设您要搜索的每个事物大致是物理对象,例如苹果、立方体、椅子。
我对 LSH 的直觉是拍摄这些物体的阴影是相似的。就像如果您拍摄一个 3D 立方体的阴影,您会在一张纸上得到一个 2D 正方形,或者一个 3D 球体会在一张纸上给您一个圆形阴影。
最终,搜索问题中的维度不止三个(文本中的每个单词都可能是一个维度),但 shadow 的类比对我来说仍然非常有用。
现在我们可以在软件中有效地比较位串。固定长度的位串或多或少有点像一维中的线。
因此,使用 LSH,我最终将对象的阴影投影为点(0 或 1)在单个固定长度的线/位串上。
整个诀窍是使阴影在较低维度上仍然有意义,例如它们与原始对象的相似程度足以被识别。
一个立方体的 2D 透视图告诉我这是一个立方体。但是我无法在没有透视的情况下轻易地区分 2D 正方形和 3D 立方体阴影:它们在我看来都像正方形。
我如何将我的对象呈现给灯光将决定我是否得到一个可识别的良好阴影。所以我认为一个“好”的 LSH 可以将我的物体转向灯光前,这样它们的阴影就可以最容易地识别为代表我的物体。
回顾一下:我认为用 LSH 索引的事物是像立方体、桌子或椅子这样的物理对象,我将它们的阴影投射到 2D 中,并最终沿着一条线(一条线)投射。一个“好的”LSH“功能”是我如何将我的对象呈现在灯光前,以便在 2D 平地和后来的位串中获得大致可区分的形状。
最后,当我想搜索我拥有的对象是否与我索引的某些对象相似时,我使用相同的方式获取这个“查询”对象的阴影,以将我的对象呈现在灯光前(最终结束也有一个位字符串)。现在我可以比较该位串与我所有其他索引位串的相似程度,如果我找到一种好的且可识别的方式将我的对象呈现在我的灯光下,它是搜索我的整个对象的代理。
【讨论】:
【参考方案4】:这是来自斯坦福的演示文稿,对此进行了解释。这对我来说有很大的不同。第二部分更多关于 LSH,但第一部分也涵盖了它。
概览图片(幻灯片中有更多内容):
高维数据中的近邻搜索 - 第 1 部分: http://www.stanford.edu/class/cs345a/slides/04-highdim.pdf
高维数据中的近邻搜索 - 第 2 部分: http://www.stanford.edu/class/cs345a/slides/05-LSH.pdf
【讨论】:
为什么不直接使用 minhash 作为 LSH 函数? 我相信因为每个桶的非重复数仍然足够高,而如果我们使用 m 个这样的独立哈希函数,非近重复映射到同一个桶的概率会大大降低。跨度> 【参考方案5】:向量空间中的推文是高维数据的一个很好的例子。
查看我关于将局部敏感哈希应用于推文以查找类似推文的博文。
http://micvog.com/2013/09/08/storm-first-story-detection/
因为一张图片是一千个单词,请查看下面的图片:
http://micvog.files.wordpress.com/2013/08/lsh1.png
希望对您有所帮助。 @mvogiatzis
【讨论】:
【参考方案6】:我见过的关于 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 Families 对余弦距离的直觉。
在图中,有两个带红色和黄色颜色的圆圈,代表两个二维数据点。我们正在尝试使用 LSH 找到他们的cosine similarity。 灰线是一些均匀随机选取的平面。 根据数据点位于灰线上方还是下方,我们将此关系标记为 0/1。 在左上角,有两排白/黑方块,分别代表两个数据点的签名。每个方块对应一个位 0(白色)或 1(黑色)。 因此,一旦您拥有了一个平面池,您就可以使用它们相对于平面的位置对数据点进行编码。想象一下,当我们在池中有更多平面时,签名中编码的角度差异更接近实际差异。因为只有位于两点之间的平面才会给两个数据不同的位值。 现在我们看看两个数据点的签名。如示例所示,我们仅使用 6 位(正方形)来表示每个数据。这是我们拥有的原始数据的 LSH 哈希。 两个哈希值之间的汉明距离为 1,因为它们的签名仅相差 1 位。 考虑到签名的长度,我们可以计算出它们的角度相似度,如图所示。我在 python 中有一些使用余弦相似度的示例代码(只有 50 行)。 https://gist.github.com/94a3d425009be0f94751
【讨论】:
为什么它被称为局部敏感?因为每个位的分配取决于每个计划的数据点的局部性? 局部敏感——位置接近的数据点被映射到相似的哈希值(在同一个桶中很有可能)。 对不起,我在这个话题上迟到了,但我有一个关于余弦的问题。演示文稿说,如果实际矢量和平面矢量之间的点积> = 0,则位值为1,否则为0。平面矢量的方向是什么,因为90度和180度之间的角度也会给出余弦为负。我想每个平面都由两个向量组成,我们采用与实际向量形成的较小角度。 谢谢。那么,说 h 编码角度差, b 编码“精度”是否正确?像这样,我理解 h*PI 是辐射中的 theta,b 是角度的精度。 你提供的幻灯片非常简洁:cs.jhu.edu/~vandurme/papers/VanDurmeLallACL10-slides.pdf - 你能否解释一下“池化技巧”的数学逻辑 - 或者我应该看看线性代数的概念来理解它?以上是关于如何理解局部敏感哈希? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
局部敏感哈希(Locality-Sensitive Hashing, LSH)