我正在尝试建立一个余弦局部敏感哈希,这样我就可以找到候选的相似项目对,而不必比较每个可能的对。我已经基本工作了,但是我数据中的大多数配对似乎在-0.2到+0.2范围内具有余弦相似度,因此我试图将其切成小方块,并选择余弦相似度0.1及更高的东西。
我一直在阅读第3章“挖掘海量数据集”。它讨论了通过放大局部敏感族来提高候选对选择的准确性。我想我只是想了解数学上的解释,但是我很难理解我是如何实际实现的。
我到目前为止所拥有的如下
- 我说有1000部电影,每部电影都有来自1M用户的评分。每部电影都由用户分数的稀疏向量表示(行数=用户ID,值=用户分数)
- 我建立了N个随机向量。向量长度与电影向量的长度(即用户数量)匹配。向量值为+1或-1。我实际上将这些向量编码为二进制以节省空间,其中+1映射为1,-1映射为0
- 我通过获取电影的点积和N个随机向量中的每一个来为每个电影构建草图向量(或者更确切地说,如果我通过水平放置N个随机向量并将它们彼此叠置来创建矩阵R,则草图因为电影m是R * m),然后取结果向量中每个元素的符号,所以我以每张+1和-1s电影的草图向量结尾,我再次将其编码为二进制。每个向量的长度为N位。
- 接下来,通过执行以下操作寻找相似的草图
- 我将素描矢量分成r位的b个带
- r位的每个带都是一个数字。我将该数字与乐队编号结合起来,然后将电影添加到该编号下的哈希存储桶中。每部电影可以添加到多个存储桶中。
- 然后,我看着每个水桶。同一存储桶中的所有电影都是候选对。
将此与mmds的3.6.3进行比较,我的AND步骤是当我查看r位的波段时-如果r位具有相同的值,则一对电影通过AND步骤。我的OR步骤发生在存储桶中:如果电影都在任何存储桶中,则它们都是候选对。
这本书建议我可以通过添加更多的AND和OR步骤来“放大”我的结果,但是我对如何实际执行操作感到困惑,因为对于进一步的层的构造过程的解释是检查成对相等性而不是检查拿出桶号。
谁能帮助我了解如何执行此操作?