放大局部敏感哈希


10

我正在尝试建立一个余弦局部敏感哈希,这样我就可以找到候选的相似项目对,而不必比较每个可能的对。我已经基本工作了,但是我数据中的大多数配对似乎在-0.2到+0.2范围内具有余弦相似度,因此我试图将其切成小方块,并选择余弦相似度0.1及更高的东西。

我一直在阅读第3章“挖掘海量数据集”。它讨论了通过放大局部敏感族来提高候选对选择的准确性。我想我只是想了解数学上的解释,但是我很难理解我是如何实际实现的。

我到目前为止所拥有的如下

  1. 我说有1000部电影,每部电影都有来自1M用户的评分。每部电影都由用户分数的稀疏向量表示(行数=用户ID,值=用户分数)
  2. 我建立了N个随机向量。向量长度与电影向量的长度(即用户数量)匹配。向量值为+1或-1。我实际上将这些向量编码为二进制以节省空间,其中+1映射为1,-1映射为0
  3. 我通过获取电影的点积和N个随机向量中的每一个来为每个电影构建草图向量(或者更确切地说,如果我通过水平放置N个随机向量并将它们彼此叠置来创建矩阵R,则草图因为电影m是R * m),然后取结果向量中每个元素的符号,所以我以每张+1和-1s电影的草图向量结尾,我再次将其编码为二进制。每个向量的长度为N位。
  4. 接下来,通过执行以下操作寻找相似的草图
    1. 我将素描矢量分成r位的b个带
    2. r位的每个带都是一个数字。我将该数字与乐队编号结合起来,然后将电影添加到该编号下的哈希存储桶中。每部电影可以添加到多个存储桶中。
    3. 然后,我看着每个水桶。同一存储桶中的所有电影都是候选对。

将此与mmds的3.6.3进行比较,我的AND步骤是当我查看r位的波段时-如果r位具有相同的值,则一对电影通过AND步骤。我的OR步骤发生在存储桶中:如果电影都在任何存储桶中,则它们都是候选对。

这本书建议我可以通过添加更多的AND和OR步骤来“放大”我的结果,但是我对如何实际执行操作感到困惑,因为对于进一步的层的构造过程的解释是检查成对相等性而不是检查拿出桶号。

谁能帮助我了解如何执行此操作?

Answers:


4

我想我已经解决了一些问题。基本上,我正在寻找一种适用于地图/缩小类型环境的方法,我认为这种方法可以做到。

所以,

  • 假设我有r行的b个波段,并且我想添加另一个AND阶段,比如说另一个c AND。
  • 所以我需要b * r * c位的哈希值来代替b * r位
  • 并且我在b * r位上每次运行我的上一个过程c次
  • 如果通过这些过程中的任何一个发现x和y是候选对,它将发出一个键值对((x,y),1),其中ID为(x,y)的元组为键,值1
  • 在c过程的结尾,我将这些对按键和求和
  • 总和等于c的任何对(x,y)在每个c回合中都是候选对,因此整个过程的候选对也是如此。

所以现在我有了一个可行的解决方案,我所要做的就是弄清楚使用这样的3个步骤是否实际上会以更少的总体哈希位数或更好的总体性能帮助我获得更好的结果...


0

HXv={0如果 sgnXv<01个其他
vHX一世=HXv一世+1个HXv一世+[RH''XĴ=FHX[RĴĴ
H''Xÿ={1个如果 H''XĴ=H''ÿĴ 对于任何 Ĵ[0b0其他
H''XÿH^小号小号小号H''XĴĴĴÿv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.