蓄水池采样算法(Reservoir Sampling)
🌀蓄水池采样算法(Reservoir Sampling)
技术分享|2024-4-9|最后更新: 2024-4-21
type
status
date
slug
summary
tags
category
icon
password

背景

等概率采样是模型训练前对样本进行处理的常见需求,但在大数据时代,经常要面对上亿的数据量,无法同时进行处理。因此,为了避免过大的时间和空间成本,同时又能达到等概率采样的效果,蓄水池采样(Reservoir Sampling)算法应运而生。

基本原理

假设需要选取的样本数为
  • 设定存储采样的蓄水池容量为
  • 对总样本空间的样本依次进行处理(样本顺序不影响最终采样概率),对第个样本,处理流程如下:
    • 如果蓄水池不满,当前样本直接被选中,进入采样池
    • 如果蓄水池已满,当前样本按照概率进入采样池,并根据随机概率值替换相应位置的样本

证明

设当前样本的下标为
  • 对于顺序小于等于的样本(即):
    • 针对第个样本,第个样本被替换的概率为,不被替换的概率为
    • 针对第个样本,第个样本不被替换的概率为
    • 到达第个样本(当前样本空间中的最后一个样本),第个样本最终被选中的概率为
  • 对于顺序大于的样本(即):
    • 当前样本被选中的概率为
    • 针对第个样本,第个样本不被替换的概率为
    • 到达第个样本(当前样本空间中的最后一个样本),第个样本最终被选中的概率为
综上,无论样本处于什么位置,最终被选中的概率均为

Python实现:

推荐系统中常见的二分类效果指标Anaconda常用指令