此链接“http://had00b.blogspot.com/2013/07/random-subset-in-mapreduce.html”讨论了如何使用map reduce框架实现油藏采样。我觉得他们的解决方案很复杂,以下更简单的方法也可以。
问题: 给定非常大量的样本,生成一组大小为k的样本,使得每个样本在该集合中具有相同的概率。
建议的解决方案:
要求: 任何数量的k大小集的概率是k / n(其中n是样本的总数)
证明直觉:
由于映射操作将每个输入样本随机分配给桶号i(0 <= i <= k-1),因此每个桶的大小将为n / k。 现在每个数字只存在于一个桶中,假设桶i。在桶i的减少操作中它被拾取的概率是1 /(n / k)= k / n
对于我的解决方案,无论是否正确,我都会感激不尽。
答案 0 :(得分:3)
你的论点有一个小缺陷。您的算法可能不会返回大小为k的样本,因为可能会发生任何元素都没有映射到特定键。在极端情况下(即使机会很小),可能会发生所有输入元素只映射到一个键,在这种情况下,您的算法只返回一个元素。
“丢失”特定密钥的事件具有概率((k-1)/ k)^ n =(1-1 / k)^ n近似(使用泰勒近似)e ^ { - n / k }。如果k远小于n,则这可以忽略不计,但如果k与n成比例,比如k = n / 2,那么这个不良事件实际上会以恒定的概率发生。