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