这个链接“ http://had00b.blogspot.com/2013/07/random-subset-in-mapreduce.html ”讨论了如何使用map reduce框架实现水库采样。我觉得他们的解决方案很复杂,以下更简单的方法会起作用。
问题: 给定大量样本,生成一个大小为 k 的集合,使得每个样本在集合中出现的概率相等。
建议的解决方案:
- 映射操作:对于每个输入数 n,输出 (i, n),其中 i 在 0 到 k-1 范围内随机选择。
- 减少操作:在所有具有相同键的数字中,随机选择一个。
声明: 任何数字在 k 大小的集合中的概率是 k/n(其中 n 是样本总数)
证明直觉:
由于映射操作将每个输入样本随机分配给编号 i (0 <= i <= k-1) 的桶,因此每个桶的大小将为 n/k。现在每个数字只出现在一个桶中,假设桶 i。它在桶 i 的 reduce 操作中被选中的概率是 1/(n/k) = k/n
我将不胜感激对我的解决方案的任何第二个想法,无论它看起来是否正确。