利用Map Reduce实现水库采样

时间:2013-08-10 20:39:25

标签: mapreduce sampling

此链接“http://had00b.blogspot.com/2013/07/random-subset-in-mapreduce.html”讨论了如何使用map reduce框架实现油藏采样。我觉得他们的解决方案很复杂,以下更简单的方法也可以。

问题: 给定非常大量的样本,生成一组大小为k的样本,使得每个样本在该集合中具有相同的概率。

建议的解决方案:

  1. 映射操作:对于每个输入数n,输出(i,n),其中i在0到k-1范围内随机选择。
  2. 减少操作:在所有具有相同键的数字中,随机选择一个。
  3. 要求: 任何数量的k大小集的概率是k / n(其中n是样本的总数)

    证明直觉:

    由于映射操作将每个输入样本随机分配给桶号i(0 <= i <= k-1),因此每个桶的大小将为n / k。 现在每个数字只存在于一个桶中,假设桶i。在桶i的减少操作中它被拾取的概率是1 /(n / k)= k / n

    对于我的解决方案,无论是否正确,我都会感激不尽。

1 个答案:

答案 0 :(得分:3)

你的论点有一个小缺陷。您的算法可能不会返回大小为k的样本,因为可能会发生任何元素都没有映射到特定键。在极端情况下(即使机会很小),可能会发生所有输入元素只映射到一个键,在这种情况下,您的算法只返回一个元素。

“丢失”特定密钥的事件具有概率((k-1)/ k)^ n =(1-1 / k)^ n近似(使用泰勒近似)e ^ { - n / k }。如果k远小于n,则这可以忽略不计,但如果k与n成比例,比如k = n / 2,那么这个不良事件实际上会以恒定的概率发生。