概率加权的随机抽样 (Weighted Random Sampling) – A-Res 蓄水池算法

2017-11-20 18:51:10

旧日重来

最近,Aulddays 遇到一个随机抽样任务。有一个对象集合,由于整个集合非常大,希望考虑每个对象的热门程度抽样出一部分对象来进行分析。把这个任务抽象出来,其实就对应了一个带概率加权的随机抽样 (Weighted Random Sampling) 问题。对应到不同的应用场景,可以对应解决搜索query抽样、商品抽样、网页抽样等任务。对于不加权的普通随机抽样,其实并不难解决,在样本集合非常大的情况下,还可以使用经典的蓄水池算法 (Reservoir Sampling) 来高效实现的抽样。但对于带概率加权的情况,就不太容易了,特别的,在 Aulddays 的任务中,结果集合中每个对象只有1次,对应了无放回的情况,则更困难一些。在内存足够的情况下,似乎还能想到接近于 O(mlogn) 的思路,但大数据上就没什么好的思路了。Survey 了一番之后,发现这个问题其实已经被研究了很久,但直到 2006 年才得到较好的解决:Pavlos S. Efraimidis and Paul G. Spirakis, 2006, Weighted random sampling with a reservoir。这里介绍一下他们提出的 A-Res 算法。

问题定义

(简单)随机抽样

给定 n 个样本(样本集合),从中随机抽出 m 个样本(抽样集合),样本集合中每个样本出现在抽样集合的概率相等(=m/n)。

加权随机抽样

样本集合中每个样本附加一个权重 wi >0,每个样本被抽中的概率由 wi 确定。wi 有两种指定方法:

概率值,即所有样本的权重 wi 加和为 1

相对权重,wi 只表明样本之间被抽中概率的相对关系,但事先并不知道每个样本具体的概率是多少。在大数据的场景下,这个是更常见的情况

显然,概率值是相对权重的一个特例,解决了相对权重的情况,拿概率值作为输入也是直接可运行的。

有放回/无放回 (with/without replacement)

顾名思义,无放回就是被抽中之后就不会被再次加入候选,也就是一个样本在最终的抽样结果中最多只出现1次。有放回则可能在结果中出现多次。更一般的,还可以定义 k-1-放回,即一个样本最多被抽中 k 次(被放回 k-1 次)。不难看出,无放回对应 k=1,而有放回对应 k=m (m是抽样集合的大小)

这里首先重点研究无放回的情况。对于有放回的情况,可以在无放回算法的基础上做简单扩展来解决。

A-Res 算法

A-Res 算法也利用了蓄水池 (reservoir) 的思想来解决大数据的问题,也就是说,事先不用知道样本集合的大小 n 和样本权重的情况(i.e. 权重之和),只需要依次遍历一次样本集合即可以得到结果,空间复杂度是 O(m),正比于结果集合的大小。

出人意料的,A-Res 算法相当简洁,只需要计算和记录一个参数即可。具体算法如下:

Algorithm: A-Res

Input: 样本序列 V,长度未知,第 i 个样本 vi 的权重为 wi

Output: 长度为 m 的结果集合 R

foreach vi in V (i = 1, 2, ...):

ki = rand(0, 1) ^ (1 / wi)

if i <= m:

(vi, ki) 加入 R

else:

(vt, kt) = min k ∈ R // Aulddays: 选出 R 中 k 最小的那个样本

if ki > kt:

(vi, ki) 替换 (vt, kt)

提示:当 wi 值为一般权重而非概率值时,可能会是一个很大的数值,从而使得 ki 的指数操作可能会丢失精度。这种情况下可以对 ki 取 log() 而变成 ki = log(rand(0, 1)) / wi,因为后续在各个 ki 之间只涉及比较相对大小而不是绝对值,所以可以保证精度的同时不影响结果。

循环中的每一轮需要查找/更新蓄水池中 ki 特征值的最小值,显然这里用一个最小堆来维护是一个较优化的选择。于是整个算法的时间复杂度就是 O(m*log(n))

显然,整个算法的核心在于 ki = (rand(0, 1)) ^ (1 / wi) 这个特征值,这里做一个简单证明:

令 U1, U2 为两个相互独立的随机变量且均服从 [0, 1] 区间上的均匀分布

令 k1 = (U1)1/w1, k2 = (U2)1/w2, 其中 w1, w2 > 0 (在算法中 w1, w2 就是对应目标样本的权重)

可以推出概率关系:P(k1≤k2) = w2/(w1+w2)

因此比较 ki 特征值确实实现了按 wi 的概率加权随机抽样

因为所有数据只需过一轮,A-Res 可以比较容易的扩展到并行或分布式的情况。

对于有放回的情况,只需要这样进行修改:创建 m 个大小为 1 的蓄水池,对于每个样本 vi,分别在每个蓄水池上独立的运行 A-Res 算法。

注意:本站所有文章除特别说明外均为原创,版权所有,转载请务必以超链接方式注明作者出处,并禁止用作商业用途

python按指定概率抽样_概率加权的随机抽样 (Weighted Random Sampling) – A-Res 蓄水池算法...相关推荐

  1. python按指定概率抽样_基于python进行抽样分布描述及实践详解

    本次选取泰坦尼克号的数据,利用python进行抽样分布描述及实践. 备注:数据集的原始数据是泰坦尼克号的数据,本次截取了其中的一部分数据进行学习.Age:年龄,指登船者的年龄.Fare:价格,指船票价 ...

  2. python按指定概率抽样_python:抽样和抽样方法

    学习目标目标 知道总体.样本.样本大小.样本数量 知道样本统计量和总体统计量 知道总体分布.样本分布和抽样分布 知道常用的抽样方法 某糖果公司研发了一种超长效口香糖,为了得到口味持续时间的数据,公司聘 ...

  3. python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码

    首先对Probabilistic Matrix Factorization这篇论文的核心公式进行讲解和推导:然后用Python代码在Movielens数据集上进行测试实验. 一. 背景知识 文中作者提 ...

  4. python 循环指定次数_亮仔的Python之路Day7——Python循环语句

    day7:2019-09-01 今日学习目的: 了解循环语句,使用代码解放劳动力 实践是检验真理的唯一标准 我们使用代码的最终目的是解放劳动力 当你还在复制粘贴累的半死的时候 别人随手几行代码就搞定 ...

  5. python删除指定行_关于csv:删除python中的特定行和对应文件

    我想删除90%的"转向"值等于0的行.这三个图像都有一个对应的图像文件,中间,左边和右边.我也要删除它们.csv文件如下: 我编写了以下代码,以至少获取转向值为0的文件.我所需要的 ...

  6. python用户画像建模_求用户画像的详细解释、建模方法及算法模型

    先给你一个传送门,目测是一个腾讯内部的培训资料:https://bbs.pinggu.org/thread-3868699-1-1.html 该文档我看了,虽然比较浅,但内容相当实在--目前大家谈起用 ...

  7. python pandas 官网_时间序列的Python-Pandas随机抽样

    你确定你需要一个更快的方法吗?你现在的方法没有那么慢.以下更改可能会简化,但不一定会更快: 步骤1:从数据帧列表中随机抽取一个样本(带替换项)rand_stocks = np.random.randi ...

  8. python awk 读文件_测试python awk sed 读取文件指定位置时的性能

    #!/bin/env python #coding:utf8 ''' awk 打印指定行数 sed 打印指定行数 python 打印指定位置,某长度字符串 awk 耗时最长,很长 sed awk 时间 ...

  9. python在docx指定位置插表格_超简单Python将指定数据插入到docx模板指定位置渲染并保存...

    超简单Python将指定数据插入到docx模板渲染并生成 最近有一个需求,制作劳动合同表,要从excel表格中将每个人的数据导入到docx劳动合同中,重复量很大,因此可以使用python高效解决.为了 ...

最新文章

  1. 解决pandas读取含有中文路径下的文件编码错误解决
  2. 管理员账号无权限写入注册表
  3. 【深度学习看手相】台湾学生获奖 AI 项目是科学还是伪科学? 搜狐科技 08-06 12:44 1新智元报道 来源: medium,facebook 编译:胡祥杰 张易 【新智元导读】本周日带来一个有
  4. 腾讯发布 2019 年研发报告:新增 12.9 亿行代码,74% 技术 Leader 仍在写代码
  5. 人脸静默活体检测最新综述
  6. amazeui学习笔记一(开始使用4)--Web App 相关
  7. UIImageView圆角,自适应图片宽高比例,图片拉伸,缩放比例和图片缩微图
  8. xcode 4.2下怎么添加framework?
  9. 【转】接口测试面试题
  10. 问世间最大的乐趣是什么?
  11. vb读取mysql数据库数据_VB读取ORACLE数据库的两种方法
  12. 叶三《我们唱》-野孩子(白银饭店)
  13. 《请君入瓮——APT攻防指南之兵不厌诈》—第8章8.5节安全贵在未雨绸缪
  14. Unity免费资源汇总
  15. Axure RP9使用指南
  16. MongoDB Mobile Sync for iOS推出Beta版本
  17. linux技术发展方向,linux技术的发展方向有哪些?Linux运维入门
  18. PTA 硬币找钱问题
  19. Chapter 2 Multi-armed Bandits 学习总结
  20. linux卸载exe文件怎么恢复,linux中误删除程序包恢复实例

热门文章

  1. Echarts修改图例legend文字颜色和字体大小
  2. 高级灰+中国红,这才是家应该有的样子
  3. dlib.get_frontal_face_detector()函数
  4. Jqgrid+Struts2实现的增删改查(一)
  5. QT中QPrinter打印功能
  6. 有打印机的源代码餐饮_云打印机在餐饮行业的应用
  7. Microsoft账户登录出现0x80190001错误代码的解决办法
  8. 户外广告的速度与激情
  9. 我比较笨,我得一步一步来
  10. 2021C++ 实验六 STL