分类目录:《机器学习中的数学》总目录


蓄水池抽样算法(Reservoir Sampling Algorithm)解决了未知长度数据的均匀抽样问题,即:给定一个数据流,数据流长度NNN很大,且NNN直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据的情况下,能够随机选取出nnn个不重复的数据,且每个数据被取到的概率都为nN\frac{n}{N}Nn​?

这个问题有3个主要难点:

  • 数据流长度NNN很大且不可知,不能一次性存入内存
  • 算法时间复杂度为O(N)O(N)O(N)
  • 随机选取nnn个数,每个数被选中的概率为nN\frac{n}{N}Nn​

第1点主要说明由于我们无法直接确定NNN,导致我们无法直接求出每个数被取到的概率nN\frac{n}{N}Nn​,也就不能直接取NNN内的nnn个随机数,然后按索引取出数据。第2点限制了不能先遍历一遍得到数据总量NNN,然后分块存储数据,再随机选取。第3点是数据选取绝对随机的保证。

蓄水池抽样算法(Reservoir Sampling Algorithm)
输入:数组ArrArrArr
( 1 )初始化长度为nnn结果数组AAA
( 2 )初始化数组读入索引i=0i=0i=0
( 3 ) while 数组ArrArrArr未遍历到末尾
( 4 ) \quad if i<ni< ni<n
( 5 ) \qquad 将Arr[i]Arr[i]Arr[i]加入到结果数组AAA
( 6 ) \quad else
( 7 ) \qquad 在[0,i][0, i][0,i]随机取一个整数ddd,若ddd在[0,n−1][0, n-1][0,n−1]范围内,则将Arr[i]Arr[i]Arr[i]存入A[d]A[d]A[d]
( 8 ) \quad i=i+1i=i+1i=i+1
( 9 )return 数组AAA

蓄水池抽样算法(Reservoir Sampling Algorithm)的精妙之处在于,对于未知长度NNN的数组,其每个数被选中的概率都为nN\frac{n}{N}Nn​。设iii为未知长度数组的数据索引(从0开始),则:

  • 若i<ni<ni<n:这些数据直接被存入结果数组AAA,遍历结束时仍留在结果数组AAA的概率为:P=nn+1×n+1n+2×⋯×N−1N=nNP=\frac{n}{n+1}\times\frac{n+1}{n+2}\times\cdots\times\frac{N-1}{N}=\frac{n}{N}P=n+1n​×n+2n+1​×⋯×NN−1​=Nn​
  • 若i≥ni\geq ni≥n:这些数据被存入数组的概率为ni+1\frac{n}{i+1}i+1n​,被存入数组的概率为且遍历结束时仍留在结果数组AAA的概率为:P=ni+1×i+1i+2×⋯×N−1N=nNP=\frac{n}{i+1}\times\frac{i+1}{i+2}\times\cdots\times\frac{N-1}{N}=\frac{n}{N}P=i+1n​×i+2i+1​×⋯×NN−1​=Nn​

若数据量过于庞大,需要使用KKK台机器处理数据,则可以使用分布式蓄水池抽样算法:

分布式蓄水池抽样算法
输入:数据流ArrArrArr;机器总数KKK
( 1 )将数据流分成KKK份:Arr1Arr_1Arr1​、Arr2Arr_2Arr2​、⋯\cdots⋯、ArrkArr_kArrk​或依次向KKK台机器输入数据
( 2 )每台机器单独使用蓄水池抽样算法,抽样nnn个数据A1A_1A1​、A2A_2A2​、⋯\cdots⋯、AKA_KAK​,并统计单台机器的数据总量N1N_1N1​、N2N_2N2​、⋯\cdots⋯、NKN_KNK​
( 3 ) 计算数据总量N=N1+N2+⋯+NKN=N_1+N_2+\cdots+N_KN=N1​+N2​+⋯+NK​并初始化长度为nnn最终结果数组AAA
( 4 ) fori=1:n\ \ i=1:n  i=1:n
( 5 ) \quad 在[1,N][1, N][1,N]随机取一个整数ddd
( 6 ) \quad 若d≤N1d\leq N_1d≤N1​,则从A1A_1A1​中无放回的随机抽取一个数据放入最终结果数组AAA;若N1<d≤N1+N2N_1<d\leq N_1+N_2N1​<d≤N1​+N2​,则从A2A_2A2​中无放回的随机抽取一个数据放入最终结果数组AAA;⋯\cdots⋯;若N1+N2+⋯+NK−1<d≤N1+N2+⋯+NKN_1 + N_2 + \cdots + N_{K-1}<d\leq N_1 + N_2 + \cdots + N_KN1​+N2​+⋯+NK−1​<d≤N1​+N2​+⋯+NK​,则从AKA_KAK​中无放回的随机抽取一个数据放入最终结果数组AAA
( 7 )return 最终结果数组AAA

我们现在来验证一下分布式蓄水池抽样算法每个数据被抽到的概率是否为nN\frac{n}{N}Nn​:

  • 对于第kkk台机器中的数据,被抽中到第kkk台机器的结果数组AkA_kAk​的概率为nNk\frac{n}{N_k}Nk​n​
  • nnn次循环后,每个数据被选入最终结果数组AAA的概率为n×nNk×NkN×1n=nNn\times\frac{n}{N_k}\times\frac{N_k}{N}\times\frac{1}{n}=\frac{n}{N}n×Nk​n​×NNk​​×n1​=Nn​

机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)相关推荐

  1. 蓄水池抽样算法(reservoir sampling)

    蓄水池抽样算法(reservoir sampling) 场景:在长度未知的数据流中,等概率地采样一定数量的数据.即,数据量N未知,若要求采样k个数据,采样概率保证kN\frac{k}{N}Nk​. 要 ...

  2. 蓄水池抽样算法 Reservoir Sampling

    2018-03-05 14:06:40 问题描述:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. 问题求 ...

  3. 机器学习中的数学——粒子群算法(Particle Swarm Optimization, PSO)(三):改进的粒子群算法

    分类目录:<机器学习中的数学>总目录 相关文章: · 梯度下降法(Gradient Descent) · 随机梯度下降(Stochastic Gradient Descent, SGD) ...

  4. 蓄水池抽样(Reservoir Sampling)

    蓄水池抽样解决的问题是当不知道N的大小时从N个数中等概率抽取k个数. 要理解这个问题,首先从抽取一个数来看. 在知道数字总数N的大小的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个数字 ...

  5. 图解连续学习中的蓄水池抽样算法(The Illustrated Reservoir sampling)

    图解连续学习中的蓄水池抽样算法The Illustrated Reservoir sampling 前言 什么是Reservoir Sampling? 蓄水池抽样算法(Reservoir sampli ...

  6. 蓄水池采样算法的python实现_蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起,那个小学数学老师带他做"小明对水池边加水边放水,求何时能加满水" ...

  7. 机器学习中的数学——模拟退火算法(Simulated Annealing,SA)

    分类目录:<机器学习中的数学>总目录 相关文章: · 梯度下降法(Gradient Descent) · 随机梯度下降(Stochastic Gradient Descent, SGD) ...

  8. 蓄水池采样算法的python实现_常用算法-蓄水池抽样算法

    Leetcode上遇到一道题,题目是这样的: 这道题的关键是链表的长度不知道,但是要使随机返回每个元素的概率相等,这一下就难倒我了,如果知道链表的长度k,从0到k中随机选择一个整数就好了呀,可现在不知 ...

  9. 机器学习里面的基函数_机器学习中的数学基函数与函数空间

    机器学习中的数学基函数与函数空间 [机器学习中的数学]基函数与函数空间 引言 在学习线性回归模型的时候就会遇到基函数,可能我们会遇到多项式基函数.高斯基函数.sigmoid基函数,当然在高等数学和信号 ...

最新文章

  1. 返回后通知(After Return Advice)
  2. 新浪微博api(.net)时间格式问题
  3. 静态代码检查工具简介
  4. Java校招笔试题-Java基础部分(四)
  5. swift闭包的另一种用法
  6. WinForms和XNA
  7. 【Photoshop教程】转发:Photoshop把帅哥转成超酷的阿凡达
  8. 无头浏览器与Puppeteer中PDF生成应用指南
  9. CodeMeter服务不能启动的解决方法,rslogix5000,无法启动,codemeter服务没有启动,
  10. java 播放h264_一个可以解码并实时播放H264的播放器
  11. 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用
  12. 【Code】8位编程语言的创始人,你知道几位?
  13. 人物-IT-史玉柱:史玉柱
  14. 身份证验证判断、身份证正则表达式、15位、18位身份证验证
  15. oracle append parallel,大量数据快速插入方法探究[nologging+parallel+append]
  16. 深度生成模型重塑药物研发【Cell子刊综述】
  17. 158、如何分辨出一台PoE交换机是否标准PoE供电
  18. 坚果PRO3搭载Android,安卓 10 来了,坚果 Pro 3 推送 Smartisan OS v7.5.0 早期众测版
  19. 针对小度在家的设备分析(以1C为例,非破解)
  20. 初识Matlab以及Matlab一般性教程

热门文章

  1. 美斯坦福大学成立以人为本AI研究院,李飞飞将领导
  2. 如何提取ipa中的图片; iphone ios 如何制作越狱ipa安装文件
  3. 使用Matlab作矩阵指数函数e^At和矩阵A
  4. 自卑心理和自卑症的典型表现以及治疗方法
  5. ABOV单片机模数转换ADC部分代码实现讲解及示例代码-[MC96F6332D]
  6. IP-Guard应用攻略-软件中心协助IT人员管理终端软件
  7. 【转】上海居住证和户口的区别
  8. 中国新能源汽车产业十四五应用建设与发展布局研究报告2022版
  9. 网络数据包片段拼合(连续h264片段拼接成完整h264帧)--纠正下,是h264 slice,不是图像帧
  10. source insight 设置颜色字体大小