蓄水池抽样算法(Reservoir Sampling)

2023-11-03

蓄水池抽样算法(Reservoir Sampling)

问题描述

给定一个数据流,数据流长度N很大,且长度不可预知。问如何在仅遍历一次数据的情况下,如何等概率 抽取m个样本。

问题分析

首先明确概念:等概率抽样是一种抽样方法,是指总体中的每个个体被抽中的概率相等。
关键点:

  1. N很大且不可预知,故无法一次性读入内存;
  2. 抽样的时间复杂度为O(N);
  3. m个样本,每个样本被选取的概率为m/n;

代码实现

int[] reservoir = new int[m];//reservoir中存放m个样本

for (int i = 0; i < reservoir.length; i++)
{
    reservoir[i] = dataStream[i];//dataStream代表未知长度的数据流
}

for (int i = m; i < dataStream.length; i++)
{
    // 随机获得一个[0, i]内的随机整数
    int d = rand.nextInt(i + 1);
    // 如果随机整数落在[0, m-1]范围内,则替换蓄水池中的元素
    if (d < m)
    {
        reservoir[d] = dataStream[i];
    }
}

算法的直观理解:

初始化蓄水池,容量为给出的m

读取数据流中的前m个数,放入蓄水池中

从第m+1个数开始遍历数据流,对于每次循环都有:
	1.根据当前遍历的序号,创建一个不大于这个序号的随机数;
	2.如果随机数 < m(即该随机数落入蓄水池中),则将该随机数对应的蓄水池中的数替换为当前序号对应的数

难以想象,简短地几行代码,就能够实现一次遍历抽样后,蓄水池中的每个元素都以m/N的概率被选取。

数学证明

明白了问题,也了解了代码的实现,接下来就是分析其中的数学原理了。
不妨采用数学归纳法。
一、考查m=1时的情况
不难看出,当N=1和N=2时,结论是正确的。
当N=3时,分别讨论第i号元素(i∈[1,3])最终被抽取到蓄水池中的概率:
假设i=1,蓄水池默认存放的就是i;
当数据流遍历到第2号元素时,i存活的概率为1/2;
当数据流遍历到第3号元素时,i存活的概率为1/22/3。这里的2/3就是由上面代码中if (d < m)计算而来的。即,当遍历到第3号元素时,从[1,3]之间抽取一个小于3的数字的概率,就等于2/3。故i存活的概率为1/22/3=1/3。
同理,可证i=2和i=3时,i存活的概率分别都是1/3。
不失一般性的,可令N=k。则对任意i(i∈[1,3]),P(i)存活的概率为1/22/33/4*…*(N-1)/N=1/N

二、考查m>1时的情况
初始的前m个元素先放在蓄水池中,该m个元素被抽样的概率均为m/N。
对于m之后的元素,令其为k(k∈[m+1,N]),则第k个元素存活的概率为
P(k)=选择k的概率 * (对于其后的每一个元素:不被选择的概率+被选择的概率*不替换第m个对象的概率),即

在这里插入图片描述

不妨添加我的微信公众号,每日精品原创干货不容错过。在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓄水池抽样算法(Reservoir Sampling) 的相关文章

  • Java实现简单版SVM

    Java实现简单版SVM 最近的图像分类工作要用到latent svm 为了更加深入了解svm 自己动手实现一个简单版的 之所以说是简单版 因为没有用到拉格朗日 对偶 核函数等等 而是用最简单的梯度下降法求解 其中的数学原理我参考了http
  • 深度学习(1):BP神经网络实现银行客户流失预测

    目的 针对银行客户行为和统计数据实现客户流失预测任务 一 数据准备 1 数据集 select data csv 作为训练样本 数据预处理方式 归一化 数值化 CreditScore 信用分数 EB 存贷款情况 EstimatedSalary
  • 4-2 过滤器法

    4 2 过滤器法 请参考 数据准备和特征工程 中的相关章节 调试如下代码 注意 本节内容因为要耗费比较大的内存 在线平台有可能无法支持 可以下载到本地执行 基础知识 from sklearn datasets import load iri
  • 文本挖掘(四万字总结篇:爬虫 - 文本预处理 - 高频词统计 - 聚类 - 情感分析)

    1 爬虫 1 1 爬虫原理 这部分内容可以跳过 掌握与否对后面内容的阅读影响并不大 但有兴趣的话可以看看呐 实现一个爬虫 一般需要经过两个步骤 处理请求和解析源码 数据 处理请求方面 我们可以使用Python程序自动发送请求 然后根据返回的
  • 数据预处理与特征工程—10.图像切割与特征提取

    文章目录 引言 一 图像切割 二 特征提取 1 各阶颜色矩的计算公式 三 python实现 水质图像数据 百度网盘链接提取码 1234 引言 本文以水质图像为例 进行图像切割与特征提取 一 图像切割 一般情况下 采集到的水样图片包含盛水容器
  • 如何统计DataFrame中各列数据分类的各个不同数据出现的次数

    可以使用 value counts 函数来统计每个不同数据在数据列中出现的次数 例如 假设有一个名为 df 的 DataFrame 其中包含一列名为 col 要统计 col 列中各个不同数据的出现次数 可以使用以下代码 counts df
  • 数据中台与数据仓库区别

    1 数据源不同 先从数据来源上来说 数据中台的数据来源可以是结构化数据或者非结构化的数据 而传统数仓的数据来源主要是业务数据库 数据格式也是以结构化数据为主 2 数据的处理不同 数据中台不仅仅是汇聚企业各种数据 而且让这些数据遵循相同的标准
  • Python人工智能,13天快速入门机器学习教程,含14大案例(NBA球员数据分析,北京租房数据,疾病数据预测等)

    40h小时入门人工智能 带你了解人工智能的前世今生 带你掌握人工智能经典算法 可掌握核心能力 1 掌握机器学习中处理数据的方法 2 理解经典的机器学习算法原理 3 掌握机器学习中工作的具体流程 Python人工智能13天快速入门机器学习教程
  • 讲解 最大流问题+最小花费问题+python(ortool库)实现

    文章目录 基本概念 图 邻接矩阵 最大流问题 python解决最大流问题 python解决最大流最小费用问题 喜欢的话请关注我们的微信公众号 你好世界炼丹师 公众号主要讲统计学 数据科学 机器学习 深度学习 以及一些参加Kaggle竞赛的经
  • 鲸鱼算法(WOA)优化极限学习机ELM回归预测,WOA-ELM回归预测,多变量输入模型

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 代码获取 论文复现及科研仿真合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab完整代码及仿真定制内容点击 智能优化算法 神经网络预测 雷达通信
  • 人工智能数据挖掘:发掘信息的新境界

    导言 人工智能数据挖掘作为信息时代的利器 通过智能算法和大数据技术的结合 为企业 学术研究和社会决策提供了前所未有的洞察力 本文将深入探讨人工智能在数据挖掘领域的应用 技术挑战以及对未来的影响 1 人工智能数据挖掘的基本原理 数据预处理 清
  • Python数据分析原来这么简单!5分钟上手,让你成为数据分析达人!

    前言 数据分析是如今信息时代的核心技能之一 通过对大量数据的收集 整理 处理和分析 数据分析师可以从中提取出有价值的信息 为企业决策提供支持和指导 而Python作为一种简单 易学且功能强大的编程语言 成为了数据分析的热门工具之一 本文将为
  • 探索关系:Python中的Statsmodels库进阶

    目录 写在开头 1 多元线性回归 场景介绍 2 Logistic回归 2 1 Logistic回归的概念 2 2 应用案例 2 2 1 建立模型和预测
  • 航空港务数据大屏为航空港的可持续发展提供有力支撑!

    随着经济的发展 不断加建与扩建民用机场 空港行业规模不断扩大 在不断引进和消化发达国家先进技术的同时 中国深入开展了对新技术和新材料的研究 极大地丰富和发展了中国的机场建设技术 且各项机场建设计划均已落实推进 行业在经济发展的推动下欣欣向荣
  • 航空港务数据大屏为航空港的可持续发展提供有力支撑!

    随着经济的发展 不断加建与扩建民用机场 空港行业规模不断扩大 在不断引进和消化发达国家先进技术的同时 中国深入开展了对新技术和新材料的研究 极大地丰富和发展了中国的机场建设技术 且各项机场建设计划均已落实推进 行业在经济发展的推动下欣欣向荣
  • Pendulum详解1——Pendulum库入门指南 - 时光的艺术

    写在开头 时间 是编程世界中不可或缺的元素 无论是事件调度 数据分析 还是用户界面的显示 时间都扮演着关键的角色 然而 在Python的标准库 datetime 中 我们经常面临繁琐的操作和限制 为了摆脱这些束缚 我们引入了一个更加强大和灵
  • 淘宝商品类目接口API:获取淘宝商品分类类目信息

    cat get 获得淘宝分类详情 响应参数 名称 类型 必须 示例值 描述 info Mix 0 cid 16 parent cid 0 name 其他女装 is parent true status normal sort order 0
  • 时间序列平稳性相关检验方法

    理解平稳性 一般来说 平稳时间序列是指随着时间的推移具有相当稳定的统计特性的时间序列 特别是在均值和方差方面 平稳性可能是一个比较模糊的概念 将序列排除为不平稳可能比说序列是平稳的更容易 通常不平稳序列有几个特征 平均值随时间推移发生变化
  • 如何快速搭建一个自营商城?(调用电商API实现快速采集商品)

    一 背景介绍 在数字化时代 电商行业蓬勃发展 无数商家涌入这片蓝海 对于许多有志于开拓电商业务的企业和个人来说 快速搭建一个自营商城成为了迫切的需求 然而 传统意义上的自建商城需要投入大量的人力 物力和时间 这让许多初创企业和个人望而却步
  • 【状态估计】电力系统状态估计中的异常检测与分类(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及详细文

随机推荐

  • 配置 Mac系统下的 SSH

    记录一次成功的SSH 在Mac上自带SSH功能 1 打开终端 在shell里选择 新建远程连接 2 选择 安全Shell ssh 选择 右下角的加号 然后输入对方的IP地址 3 选中已经添加成功的IP地址 在下面输入用户名 就是对方的 前面
  • Mysql锁机制简单了解一下

    历史文章推荐 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机 jvm 的问题看这篇就够了 Java NIO 概览 关于分布式计算的一些概念 一 锁分类 按照锁的粒度分类 Mysql为了解决并发 数据安全的问题 使用了锁机制
  • 深度学习框架是做什么的

    3分钟看懂旷视深度学习框架天元MegEngine
  • c++中调用复制构造函数的三种情况

    普通构造函数是在对象创建时被调用 而复制构造函数在以下三种情况下会被调用 1 当用类的一个对象去初始化该类的另一个对象时 例如 Point a 1 2 Point b a 调用复制构造函数 Point c a 同上 2 如果函数的形参是类的
  • weex dom.scrollToElement 滚动问题

    使用weex 的dom scrollToElement 兼容问题 1 使用for生成的ref 在初始化获取ref节点时候需要有100ms延迟 2 dom scrollToElement 传入的 ref参数 需要使用this refs ref
  • DNS中的正向解析与反向解析 及 nslookup命令使用

    DNS中的正向解析与反向解析 Jackxin Xu IT技术专栏 博客频道 CSDN NET http blog csdn net jackxinxu2100 article details 8145318 正向解析 通过域名查找ip 反向
  • 黑盒测试方法之因果图和判定表——三

    前面文章 黑盒测试方法之因果图和判定表 一 主要讲述判定表驱动法的相关理论内容 黑盒测试方法之因果图和判定表 二 主要讲述因果图相关理论内容 4 因果图加判定表设计测试用例实例 这里以一个 软件评测师教程 上面的例子为例 来说明和演示因果图
  • GAN(初步学习)

    GAN的原理介绍 GAN的主要灵感来源于博弈论中零和博弈的思想 应用到深度学习神经网络上来说 就是 通过生成网络G Generator 和判别网络D Discriminator 不断博弈 进而使G学习到数据的分布 如果用到图片生成上 则训练
  • Zotero 相关学习链接

    参考链接 https www zotero org support zh start https github com l0o0 translators CN https www zhihu com question 21518558 ht
  • ROS串口通信(1)环境搭建

    ROS串口通信 1 环境搭建 引言 1 ubuntu串口驱动安装和使用 1 1 安装 1 2 使用 1 3 Ubuntu 查看串口 设置串口权限 2 Ubuntu下的串口助手cutecom 引言 无疑 串口的调试需要联合串口助手调试更加方便
  • 软件测试2019:第一次作业

    就是利用测试工具按照测试方案和流程对产品进行功能和性能测试 甚至根据需要编写不同的测试工具 设计和维护测试系统 对测试方案可能出现的问题进行分析和评估 执行测试用例后 需要跟踪故障 以确保开发的产品适合需求 使用人工或者自动手段来运行或测试
  • 三分钟拥有自己的 chat-gpt (开发到上线)

    三分钟拥有自己的 chat gpt 开发到上线 首先你需要有一个 laf 账号 如果你还不知道 laf 是什么 点击这里三分钟学会 然后你还需要有一个 chat gpt 的账号并且生成一个 apiKey 这一步可以问 Google 云函数
  • Centos 7 阿里yum源及epel源配置

    1 下载阿里yum配置文件 wget O etc yum repos d CentOS Base repo http mirrors aliyun com repo Centos 7 repo 2 下载阿里epel配置文件 wget O e
  • ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26‘ not found

    在运行程序的时候报错 import cv2 ImportError usr lib x86 64 linux gnu libstdc so 6 version GLIBCXX 3 4 26 not found required by hom
  • 【STM32内部架构理解】

    STM32和GD32F10X内部架构 整体架构 模块架构 总线矩阵 最开始学stm32开始对架构各部分不是很了解看架构图基本上走马观花 然后陷入对各个外设的投入中去 比如GPIO ADC CAN等 但是对整体架构的掌握对后面编程很多细节的理
  • 列表首屏毫秒级加载与自动滚动定位方案

    引用自 摸鱼wiki 场景
  • 利用libuv编写异步多线程的addon实例

    转载自 http snoopyxdy blog 163 com blog static 601174402013422103614385 最近cnode上很多TX在问关于node的异步回调以及单线程的事情 今天看了libuv的一些api和d
  • 微信小程序启动自动检测版本更新,检测到新版本则提示更新

    UpdateManager 对象 用来管理更新 可通过 wx getUpdateManager 接口获取实例 在app js中的示例代码 onShow 获取小程序更新机制的兼容 由于更新的功能基础库要1 9 90以上版本才支持 所以此处要做
  • 垃圾分类资料汇总

    目录 一 前言 二 垃圾分类话题简介 三 当前存在的一些有用参考资源 四 当前存在的垃圾分类小程序或者APP 五 当前规模比较大的产品 六 个人想法 参考资料 注意事项 一 前言 自从上海实行了垃圾分类之后 垃圾分类这个话题就成为了一个热点
  • 蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法 Reservoir Sampling 问题描述 问题分析 代码实现 数学证明 问题描述 给定一个数据流 数据流长度N很大 且长度不可预知 问如何在仅遍历一次数据的情况下 如何等概率 抽取m个样本 问题分析 首先明确概念 等概