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


蓄水池抽样算法(Reservoir Sampling Algorithm)解决了未知长度数据的均匀抽样问题,即:给定一个数据流,数据流长度机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能很大,且机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据的情况下,能够随机选取出机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_03个不重复的数据,且每个数据被取到的概率都为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_04

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

  • 数据流长度机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_05很大且不可知,不能一次性存入内存
  • 算法时间复杂度为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_06
  • 随机选取机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_07个数,每个数被选中的概率为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_08

第1点主要说明由于我们无法直接确定机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能,导致我们无法直接求出每个数被取到的概率机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_04,也就不能直接取机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能内的机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_03个随机数,然后按索引取出数据。第2点限制了不能先遍历一遍得到数据总量机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能,然后分块存储数据,再随机选取。第3点是数据选取绝对随机的保证。

蓄水池抽样算法(Reservoir Sampling Algorithm)
输入:数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_14
( 1 )初始化长度为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_15结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16
( 2 )初始化数组读入索引机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_17
( 3 ) while 数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_14未遍历到末尾
( 4 ) 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_19 if 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_20
( 5 ) 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_21机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_22加入到结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16
( 6 ) 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_19 else
( 7 ) 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_21机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_26随机取一个整数机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_27,若机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_27机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_29范围内,则将机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_22存入机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_31
( 8 ) 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_19 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_33
( 9 )return 数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16

蓄水池抽样算法(Reservoir Sampling Algorithm)的精妙之处在于,对于未知长度机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能的数组,其每个数被选中的概率都为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_04。设机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_37为未知长度数组的数据索引(从0开始),则:

  • 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_38:这些数据直接被存入结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_39,遍历结束时仍留在结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_39的概率为:机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_41
  • 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_42:这些数据被存入数组的概率为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_43,被存入数组的概率为且遍历结束时仍留在结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_39的概率为:机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_45

若数据量过于庞大,需要使用机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_46台机器处理数据,则可以使用分布式蓄水池抽样算法:

分布式蓄水池抽样算法
输入:数据流机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_14;机器总数机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_48
( 1 )将数据流分成机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_48份:机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_50机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_51机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_52机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_53或依次向机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_48台机器输入数据
( 2 )每台机器单独使用蓄水池抽样算法,抽样机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_15个数据机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_56机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_57机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_52机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_59,并统计单台机器的数据总量机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_60机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_61机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_52机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_63
( 3 ) 计算数据总量机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_64并初始化长度为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_15最终结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16
( 4 ) for机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_67
( 5 ) 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_19机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_69随机取一个整数机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_27
( 6 ) 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_19机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_72,则从机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_56中无放回的随机抽取一个数据放入最终结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16;若机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_75,则从机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_57中无放回的随机抽取一个数据放入最终结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_人工智能_52;若机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_79,则从机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_59中无放回的随机抽取一个数据放入最终结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16
( 7 )return 最终结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_深度学习_16

我们现在来验证一下分布式蓄水池抽样算法每个数据被抽到的概率是否为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_04:

  • 对于第机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_84台机器中的数据,被抽中到第机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_84台机器的结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_86的概率为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_87
  • 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_抽样_07次循环后,每个数据被选入最终结果数组机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_机器学习_39的概率为机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)_蓄水池抽样_90