【概率论】一种非常巧妙的随机抽样算法

假设我们现在要在集合 { 0 , 1 , 2 , ⋯   , n − 1 } \{0,1,2,\cdots,n-1\} {0,1,2,,n1}中随机抽取 k k k个数( k ≤ n k\le n kn)。显然每个元素被抽中的概率均为 k n \frac{k}{n} nkC++代码如下:

vector<int> sample_integers(int n, int k = 3)
	// 在{0, 1, 2, ..., n - 1}中等可能地抽取k个元素
{
    vector<int> result;
    int i = 0;
    for(; n > 0; ++i, --n)
    {
        if(gen() % n < k) // 这个i被选中的几率是k/n
        {
            --k;
            result.push_back(i);
        }
    }
    return result;
}

时间复杂度为 O ( n ) O(n) O(n)。要理解这种算法的正确性,我们只需证明每个元素被抽中的几率都是 k n \frac{k}{n} nk。又因为数学归纳法,我们只需证明第一个元素被抽中的概率等于后面的元素被抽中的概率。

显然,抽中第一个元素 0 0 0的概率是 k n \frac{k}{n} nk。如果第一个元素被抽中了,那么后面的每个元素被抽中的概率是 k − 1 n − 1 \frac{k-1}{n-1} n1k1;如果第一个元素没有被抽中,后面的每个元素被抽中的概率是 k n − 1 \frac{k}{n-1} n1k。根据全概率公式,后面的每个元素被抽中的概率是 P { 后面的某个被抽中抽 } = P { 后面的某个被抽中抽 ∣ 第一个元素被抽中 } P { 第一个元素被抽中 } + P { 后面的某个被抽中抽 ∣ 第一个元素没有被抽中 } P { 第一个元素没有被抽中 } = k − 1 n − 1 k n + k n − 1 n − k k = k n − 1 k − 1 n + k n − 1 n − k n = k n − 1 ( k − 1 n + n − k n ) = k n − 1 n − 1 n = k n \begin{aligned} P\{\text{后面的某个被抽中抽}\}&=P\{\text{后面的某个被抽中抽}|\text{第一个元素被抽中}\}P\{\text{第一个元素被抽中}\}\\&\qquad+P\{\text{后面的某个被抽中抽}|\text{第一个元素没有被抽中}\}P\{\text{第一个元素没有被抽中}\}\\ &=\frac{k-1}{n-1}\frac{k}{n}+\frac{k}{n-1}\frac{n-k}{k}\\ &=\frac{k}{n-1}\frac{k-1}{n}+\frac{k}{n-1}\frac{n-k}{n}\\ &=\frac{k}{n-1}\left(\frac{k-1}{n}+\frac{n-k}{n}\right)\\ &=\frac{k}{n-1}\frac{n-1}{n}\\ &=\frac{k}{n} \end{aligned} P{后面的某个被抽中抽}=P{后面的某个被抽中抽第一个元素被抽中}P{第一个元素被抽中}+P{后面的某个被抽中抽第一个元素没有被抽中}P{第一个元素没有被抽中}=n1k1nk+n1kknk=n1knk1+n1knnk=n1k(nk1+nnk)=n1knn1=nk这样就证明了抽中每个元素的概率均为 k n \frac{k}{n} nk

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
水库抽样算法一种用于估计大规模数据集中某个属性的方法。它的基本思想是在不遍历整个数据集的情况下,通过随机抽样的方式获取部分数据来进行估计。 数学上,我们可以用概率论的方法来证明水库抽样算法的有效性。设想我们有一个包含N个元素的数据集,我们希望通过抽样得到一个大小为k的样本,其中每个元素被选中的概率都是相等的。 假设我们进行一次抽样,某个元素被选中的概率为p。由于每个元素被选中的概率相等,所以我们可以得到如下等式: p = k / N 假设我们进行了m次抽样,每次都独立地选择元素。现在我们来考虑某个特定的元素,在m次抽样中都没有被选中的概率。 在第一次抽样中,该元素没有被选中的概率为 (1-p) = (N-k)/N 在第二次抽样中,该元素没有被选中的概率也为 (N-k)/N 以此类推,在m次抽样中都没有被选中的概率为 ((N-k)/N)^m 现在我们来考虑该元素至少在m次抽样中被选中一次的概率。这个概率可以用1减去上面的概率来计算,即: 1 - ((N-k)/N)^m 当m趋近于无穷大时,上式中的 ((N-k)/N)^m 会趋近于0,所以该元素至少在m次抽样中被选中一次的概率会趋近于1。这意味着随着抽样次数的增加,每个元素被选中的机会趋近于相等,满足我们的要求。 综上所述,通过数学证明我们可以得出结论:水库抽样算法能够以相等的概率对数据集中的每个元素进行抽样,从而实现对整个数据集进行估计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值