如何通过MapReduce实现LSH?

时间:2015-03-28 18:28:54

标签: mapreduce

假设我们希望通过MapReduce实现Local Sensitive Hashing(LSH)。具体来说,假设签名矩阵的块由列组成,而元素是键值对,其中键是列号,值是签名本身(即值的向量)。

(a)展示如何为所有乐队制作乐队作为单曲的输出 MapReduce进程。提示:请记住,Map函数可以生成 来自单个元素的几个键值对。

(b)展示另一个MapReduce进程如何将(a)的输出转换为 需要比较的对列表。具体来说,对于每列i, 应该列出那些列j>我需要的是 比较。

1 个答案:

答案 0 :(得分:2)

(a)中

  • Map:元素及其签名作为输入,生成键值对(bucket_id,element)
  • 减少:为所有频段生成桶作为输出,即 (bucket_id,list(elements))

map(key, value: element):
    split item to bands
    for band in bands:
        for sig in band:
            key = hash(sig) // key = bucket id
        collect(key, value)

reduce(key, values):
    collect(key, values)

(b)

  • Map:(a)的输出作为输入,生成组合列表 桶,即(bucket_id,list(elements)) - > (bucket_id, 组合(list(elements))),combination()是任意两个元素 从同一桶中选择。
  • 减少:输出需要的项目对 比较,具体来说,对于每列i,应该有一个列表 那些列j>我需要与之进行比较。

map(key, value):
    for itemA, itemB in combinations(value)
        key = (itemA.id, itemB.id)
        collect(key, [itemA, itemB])

reduce(key, values):
    collect(key, values)