Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >池塘抽样 Reservoir Sampling

池塘抽样 Reservoir Sampling

原创
作者头像
TimGallin
发布于 2022-01-30 08:29:03
发布于 2022-01-30 08:29:03
8530
举报
文章被收录于专栏:thinkythinky

什么是Reservoir Sampling

Reservoir Sampling,水塘抽样算法是随机算法的一种,通常用于选取简单随机样本。

Reservoir Sampling 的用途

对于一个固定样本,样本总数为n,要在其中随机抽取k个样本,我们可以通过在[0,n)中进行随机取数,以保证选取样本的随机性。但是,当n变成一个极大的不固定的数,大到无法将n个样本全部载入到内存中,那么上述通过[0,n)随机数的方式就不能达到期望。需要一种在n不确定情况下,也可以针对全部样本进行随机抽样的算法。Reservoir Sampling可以达到O(n)时间复杂度内与O(k)的空间复杂度。

实现

使用链表结构表示未知大小的样本总数,随机选取k个样本

代码语言:txt
AI代码解释
复制
#1.将[0, k)个样本依次放入reservoir[k]中
#2.遍历I in [k, n),每次从[0, i]随机一个数r,假设r∈[0, k),则将reservoir[r]替换为m
class Solution:
    def __init__(self, head: Optional[ListNode]):
        self.head = head

    def getRandom(self, k: int) -> List:
        node, i = self.head, 0
        reservoir = [] 
        for _ in range(k) :
            reservoir.append(node)
            node = node.next
            i += 1
        while node:
            r = randrange(i) 
            if r < k:  
                reservoir[r] = node.val
            i += 1
            node = node.next
        return reservoir

证明

在未知样本streamn大小的前提下,这里对k个样本的随机性进行证明,也就是每个待选样本被选中的概率都是k/n。根据实现方式,可以将证明分为两部分

1. 证明范围在[k, n)的倒数k个数被选取的概率是k/n

对于这个范围内的每一个streami元素,执行的操作都是先从[0,i)随机一个数r,假设r<k,则将reservoirr替换为streami。考虑最后一个样本streamn-1被选中的概率,由于是最后一个样本,因此该样本一旦被选取,后续不会存在再被替换的可能。因此只要随机数小于k,则该样本被选中,即使概率是k/n。而对于倒数第二个样本,即streamn-2,它最终被选取的概率p应该是在遍历到n-2时该样本被选中的概率 乘以 最后一个样本所得到的随机数与上一个样本的随机数不同的概率。streamn-2被选中的概率是k/n-1,streamn-1被选中且不会替换掉streamn-1的概率,等同于streamn-1时的随机数与上一个随机数不同的概率,此时待选随机数有n个,由于上一个随机数是已经发生的事件,该随机数是一个固定的数字,那么在剩余n-1个数中任选一个数必然不会与上一个随机数相同,因此该概率是n-1/n。综上得出,streamn-2最终能被选中的概率p = (k/n-1) * (n-1/n) = k/n。

与以上推到过程类似,我们容易得出[k, n)范围内倒数k个样本,每个样本最终被选取的概率是k/n。

2. 证明[0, k)范围内前k个数,每个数最终被选取的概率是k/n

前个数初始化时就被按序放入reservoirk中,对于每个样本来说,最终被选取的概率,就是在[k, n)过程完成后还没有被替换的概率。以第一个样本为例,在第k+1个样本时不会替换第一个样本的概率,就是在[0, k+1)范围内取随机数不取到1的概率,也就是1 - (1/k+1) = k/k+1,以次类推,第一个样本最终被选取的概率p= k/(k+1) (k+1)/(k+2) ... * (n-1)/n = k/n。同理可得,在[0, k)范围内前k个数,每个数最终被选取的概率是k/n。

参阅

1.geekforgeeks, reservoir sampling

2.leetcode, 链表随机节点

3.wiki, reservoir sampling

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么是水塘抽样算法(Reservoir Sampling)
给定一个数据流,数据流长度N很大,且N直到处理完所有数据之前都不可知,如何在只遍历一遍数据(O(N))的情况下,能够随机选取出这组数据的k个概率相等的均匀抽样。
我是攻城师
2018/12/24
5.4K0
什么是水塘抽样算法(Reservoir Sampling)
Reservoir Sampling 蓄水池采样算法
问题描述:给定一串很长的数据流,对该数据流中数据只能访问一次,使得数据流中所有数据被选中的概率相等。
为为为什么
2023/07/20
5080
蓄水池抽样-Reservoir Sampling
 英文原文:hadoop-stratified-randosampling-algorithm         译者:bruce-accumulate      引言:众所周知,想要面试一个统计学家和软件工程师的合体——数据工程师——是件很难的事情。我在面试中常使用的方法是:提出即需要算法设计,又需要一些概率论知识的问题,来考察面试者的功底。下面就是在硅谷非常流行的例子:  “给出一个数据流,这个数据流的长度很大或者未知。并且对该数据流中数据只能访问一次。请写出一个随机选择算法,使得数据流中所有数据被选
老白
2018/03/19
1.6K0
蓄水池抽样-Reservoir Sampling
蓄水池抽样
1、给定一个数据流,数据流长度N很大,且N直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出m个不重复的数据
高性能架构探索
2021/07/23
8780
蓄水池抽样
洗牌算法思路_随机洗牌算法
笔试时,遇到一个算法题:差不多是 在n个不同的数中随机取出不重复的m个数。洗牌算法是将原来的数组进行打散,使原数组的某个数在打散后的数组中的每个位置上等概率的出现,刚好可以解决该问题。
全栈程序员站长
2022/11/08
8460
随机算法之水塘抽样算法
我最近在 LeetCode 上做到两道非常有意思的题目,382 和 398 题,关于水塘抽样算法(Reservoir Sampling),本质上是一种随机概率算法,解法应该说会者不难,难者不会。
lucifer210
2020/02/26
1K0
概率/随机数算法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158929.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/17
1.3K0
蓄水池采样算法(Reservoir Sampling)
假定有数据个数未知的数据流,要求随机其中的选择 个数据,且保证每个数据选中的概率相等。
用户1148830
2021/12/31
7320
说透游戏中常用的两种随机算法
读完本文,可以去力扣解决如下题目: 382. 链表随机节点(中等) 398. 随机数索引(中等) 384. 打乱数组(中等)
labuladong
2022/12/10
9060
说透游戏中常用的两种随机算法
蓄水池抽样算法
如果n并不是一个特别大的数字,我们可以一次性把这n个数字加载进内存,每次从中选取1个,选取m次。
兜兜转转
2023/03/06
7440
leetcode382. Linked List Random Node
在等概率随机选择算法中,最经典的算法就是蓄水池算法。可以参考同类型题目398 random pick index。这里再次整理一下蓄水池算法的思路和简单证明。
眯眯眼的猫头鹰
2019/07/02
3860
水塘抽样与阶层固化
简单抽样算法就是从固定的n个元素里随机选出k个元素,这样每个元素被选的概率都是平等的k/n。简单抽样是最简单的抽样算法,同样也是使用最为普遍的算法。
老钱
2018/08/15
7320
文心一言 VS 讯飞星火 VS chatgpt (134)-- 算法导论11.2 6题
在这个问题中,我们需要使用 Go 语言在一个大小为 m 且通过链接法解决冲突的散列表中,从 n 个关键字中均匀随机地选择一个元素。为了达到 O(L·(1+1/a)) 的期望时间复杂度,我们需要考虑以下几个步骤:
福大大架构师每日一题
2023/11/14
2130
文心一言 VS 讯飞星火 VS chatgpt (134)-- 算法导论11.2 6题
收藏 | 机器学习中需要了解的 5 种采样方法
我们可以选择在整个人口中随机抽取一个 60 大小的样本,但在这些城镇中,随机样本可能不太平衡,因此会产生偏差,导致估计误差很大。
小白学视觉
2022/05/22
6270
收藏 | 机器学习中需要了解的 5 种采样方法
数据科学家需要了解的 5 种采样方法
采样问题是数据科学中的常见问题,对此,WalmartLabs 的数据科学家 Rahul Agarwal 分享了数据科学家需要了解的 5 种采样方法,AI 开发者将文章编译整理如下。
AI研习社
2019/08/01
1.7K0
最优停止法则-麦穗理论
看到一个最优停止法则-麦穗理论,故分享给读者,并通过Matlab进行结果验证 麦穗理论   有一天,柏拉图问老师苏个拉底什么是爱情?老师就让他先到麦田里去,摘一颗全麦田里最大最金黄的麦穗来。期间只
用户9925864
2022/07/27
1.4K0
最优停止法则-麦穗理论
leetcode384. Shuffle an Array
实现shuffle和reset方法,分别能够完成数组的随机打乱和还原。随机打乱即该数组中元素的所有排列组合结果都能够以等比例的概率输出。
眯眯眼的猫头鹰
2019/07/02
6470
征服大数据算法面试:核心题型与实战解析
当今顶尖科技公司的数据团队面试中,算法能力考核占据决定性地位。与常规算法面试不同,大数据场景下的题目往往具有三个显著特征:
海拥
2025/07/22
1490
ReSTIR论文Review
‘Spatiotemporal reservoir resampling for real-time ray tracing with dynamic direct lighting’这篇论文是Wojciech团队的Benedikt Bitterli(一作)于2020年发表在SIGGRAPH,并得到了广泛的好评,这在实时渲染领域实属难得。
Peter Lu
2021/06/21
1.4K0
ReSTIR论文Review
概率抽样方法简介
本文介绍了抽样方法在数据科学领域的应用,包括简单随机抽样、分层抽样、整群抽样、多级抽样和特殊采样方法。这些抽样方法旨在从庞大的数据集中抽取有代表性的样本,以便进行数据分析和建模。每种抽样方法都有各自的优缺点和适用场景,需要根据数据的特点和问题需求来选择合适的抽样方法。同时,针对类不平衡问题,还可以采用过采样和欠采样方法进行处理,以增加少数类的样本数量,提高模型的性能。
serena
2017/10/20
4.1K1
相关推荐
什么是水塘抽样算法(Reservoir Sampling)
更多 >
LV.0
这个人很懒,什么都没有留下~
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档