水库采样理解概率

时间:2016-02-10 21:28:10

标签: algorithm random probability probability-theory

我无法理解水库采样中涉及的概率。以下是我见过的示例代码,几乎无处不在:

    1/*
    2  S has items to sample, R will contain the result, K number of items to select
    3*/
    4ReservoirSample(S[1..n], R[1..k])
    5  // fill the reservoir array
    6  for i = 1 to k
    7      R[i] := S[i]
    8
    9 // replace elements with gradually decreasing probability
    10  for i = k+1 to n
    11    j := random(1, i)   // important: inclusive range
    12    if j <= k
    13        R[j] := S[i]

我的理解是否正确(?): 假设我们有k = 3并且输入= [100,200,300,400,500]并且我目前处于500指数。在储层中替换300的概率(其大小为3)=在储层中选择300的概率*选择500的概率,这仅在随机函数返回的指数小于或等于3的情况下才有可能5种选择= 1/3 * 3/5 = 1/5

1 个答案:

答案 0 :(得分:0)

您的理解似乎不正确。选择500的概率与300的选择无关。

你应该查看gfg link for the same.“这是如何工作的?”部分,其中说明了以下内容:

  

情况1:对于最后的n-k个流项,即对于流[i],其中k <= i <1。 ñ   对于每个这样的流项目流[i],我们选择从0到i的随机索引,如果拾取的索引是前k个索引之一,我们用stream [i]

替换拾取索引处的元素      

为了简化证明,我们首先考虑最后一项。最后一个项目在最终库中的概率=为最后一个项目挑选前k个索引之一的概率= k / n(从大小为n的列表中挑选k个项目之一的概率)

     

现在让我们考虑倒数第二项。第二个最后项目在最终库中的概率[] = [在流[n-2]的迭代中选择前k个索引之一的概率] X [索引在流[n-1]的迭代中选择的概率]与为流[n-2]]选择的索引不同= [k /(n-1)] * [(n-1)/ n] = k / n。

     

同样,我们可以考虑从流[n-1]到stream [k]的所有流项目的其他项目并概括证明。

     

情况2:对于前k个流项,即对于stream [i],其中0 <= i <1。 ķ   最初的k个项目最初被复制到reserv [],并且可以在稍后的流[k]到stream [n]的迭代中被移除。   流[0..k-1]中的项目在最终数组中的概率=当项目流[k],流[k + 1],...时未选择项目的概率。 stream [n-1]被认为= [k /(k + 1)] x [(k + 1)/(k + 2)] x [(k + 2)/(k + 3)] x ... x [ (n-1)/ n] = k / n

相关问题