【问题标题】:Is there an algorithm for weighted reservoir sampling? [closed]是否有加权水库采样算法? [关闭]
【发布时间】:2013-06-14 21:59:14
【问题描述】:

当数据流中的点具有关联的权重时,是否有算法来执行水库采样?

【问题讨论】:

    标签: language-agnostic sampling


    【解决方案1】:

    Pavlos Efraimidis 和 Paul Spirakis 的算法正好解决了这个问题。带有完整证明的原始论文发表在 Information Processing Letters 2006 中,标题为“Weighted random sampling with a reactor”,但您可以找到一个简单的摘要here

    该算法的工作原理如下。首先观察另一种解决未加权水库采样的方法是为每个元素分配一个介于 0 和 1 之间的随机 id R,并逐步(例如使用堆)跟踪前 k 个 id。现在让我们看一下加权版本,假设第 i 个元素的权重为 w_i。然后,我们通过选择第 i 个元素的 id 为 R^(1/w_i) 来修改算法,其中 R 再次均匀分布在 (0,1) 中。

    另一篇讨论这个算法的文章是 Cloudera 的 this one

    【讨论】:

    • 还有一个python实现:heapq.nlargest(k, items, key=lambda item: math.pow(random.random(), 1/weight(item)))
    • 是否可以通过替换来做到这一点?
    • @eleanora 因为有别名方法,所以用replacement没有意义,你需要先创建一个表,需要O(n)时间,然后每个选择都是O(1) .但是,除非您将 Alias 与替换一起使用,否则 Alias 不会在选择时保持其运行时复杂性。
    • Cloudera 似乎已将原始文章撤下。似乎是副本的内容可以在here找到。
    【解决方案2】:

    您可以从this paper of S. Efraimidis 尝试 A-ES 算法。代码非常简单,效率很高。

    希望这会有所帮助,

    伯努瓦

    【讨论】:

      猜你喜欢
      • 2014-12-23
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      相关资源
      最近更新 更多