MapReduce如何实现LSH?
How to implement LSH by MapReduce?
假设我们希望通过MapReduce 实现局部敏感散列(LSH)。具体来说,假设签名矩阵的块由列组成,元素是键值对,其中键是列号,值是签名本身(即值向量)。
(a) 显示如何为所有波段生成桶作为单个输出
MapReduce 过程。提示:记住 Map 函数可以产生
来自单个元素的多个键值对。
(b) 显示另一个 MapReduce 进程如何将 (a) 的输出转换为
需要比较的对列表。具体来说,对于每一列 i,
应该有我需要的那些列的列表 j > i
比较
(一)
- Map:将元素及其签名作为输入,产生键值对(bucket_id,元素)
- Reduce:生成所有波段的桶作为输出,即
(bucket_id, 列表(元素))
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,
组合(列表(元素))),其中组合()是任意两个元素
从同一个桶中选择。
- Reduce:输出需要的item对
相比之下,具体来说,对于每一列 i,应该有一个列表
需要与 i 进行比较的那些列 j > i。
map(key, value):
for itemA, itemB in combinations(value)
key = (itemA.id, itemB.id)
collect(key, [itemA, itemB])
reduce(key, values):
collect(key, values)
假设我们希望通过MapReduce 实现局部敏感散列(LSH)。具体来说,假设签名矩阵的块由列组成,元素是键值对,其中键是列号,值是签名本身(即值向量)。
(a) 显示如何为所有波段生成桶作为单个输出 MapReduce 过程。提示:记住 Map 函数可以产生 来自单个元素的多个键值对。
(b) 显示另一个 MapReduce 进程如何将 (a) 的输出转换为 需要比较的对列表。具体来说,对于每一列 i, 应该有我需要的那些列的列表 j > i 比较
(一)
- Map:将元素及其签名作为输入,产生键值对(bucket_id,元素)
- Reduce:生成所有波段的桶作为输出,即 (bucket_id, 列表(元素))
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, 组合(列表(元素))),其中组合()是任意两个元素 从同一个桶中选择。
- Reduce:输出需要的item对 相比之下,具体来说,对于每一列 i,应该有一个列表 需要与 i 进行比较的那些列 j > i。
map(key, value):
for itemA, itemB in combinations(value)
key = (itemA.id, itemB.id)
collect(key, [itemA, itemB])
reduce(key, values):
collect(key, values)