python按指定概率抽样_概率加权的随机抽样 (Weighted Random Sampling) – A-Res 蓄水池算法...
概率加权的随机抽样 (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 蓄水池算法...相关推荐
- python按指定概率抽样_基于python进行抽样分布描述及实践详解
本次选取泰坦尼克号的数据,利用python进行抽样分布描述及实践. 备注:数据集的原始数据是泰坦尼克号的数据,本次截取了其中的一部分数据进行学习.Age:年龄,指登船者的年龄.Fare:价格,指船票价 ...
- python按指定概率抽样_python:抽样和抽样方法
学习目标目标 知道总体.样本.样本大小.样本数量 知道样本统计量和总体统计量 知道总体分布.样本分布和抽样分布 知道常用的抽样方法 某糖果公司研发了一种超长效口香糖,为了得到口味持续时间的数据,公司聘 ...
- python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码
首先对Probabilistic Matrix Factorization这篇论文的核心公式进行讲解和推导:然后用Python代码在Movielens数据集上进行测试实验. 一. 背景知识 文中作者提 ...
- python 循环指定次数_亮仔的Python之路Day7——Python循环语句
day7:2019-09-01 今日学习目的: 了解循环语句,使用代码解放劳动力 实践是检验真理的唯一标准 我们使用代码的最终目的是解放劳动力 当你还在复制粘贴累的半死的时候 别人随手几行代码就搞定 ...
- python删除指定行_关于csv:删除python中的特定行和对应文件
我想删除90%的"转向"值等于0的行.这三个图像都有一个对应的图像文件,中间,左边和右边.我也要删除它们.csv文件如下: 我编写了以下代码,以至少获取转向值为0的文件.我所需要的 ...
- python用户画像建模_求用户画像的详细解释、建模方法及算法模型
先给你一个传送门,目测是一个腾讯内部的培训资料:https://bbs.pinggu.org/thread-3868699-1-1.html 该文档我看了,虽然比较浅,但内容相当实在--目前大家谈起用 ...
- python pandas 官网_时间序列的Python-Pandas随机抽样
你确定你需要一个更快的方法吗?你现在的方法没有那么慢.以下更改可能会简化,但不一定会更快: 步骤1:从数据帧列表中随机抽取一个样本(带替换项)rand_stocks = np.random.randi ...
- python awk 读文件_测试python awk sed 读取文件指定位置时的性能
#!/bin/env python #coding:utf8 ''' awk 打印指定行数 sed 打印指定行数 python 打印指定位置,某长度字符串 awk 耗时最长,很长 sed awk 时间 ...
- python在docx指定位置插表格_超简单Python将指定数据插入到docx模板指定位置渲染并保存...
超简单Python将指定数据插入到docx模板渲染并生成 最近有一个需求,制作劳动合同表,要从excel表格中将每个人的数据导入到docx劳动合同中,重复量很大,因此可以使用python高效解决.为了 ...
最新文章
- 解决pandas读取含有中文路径下的文件编码错误解决
- 管理员账号无权限写入注册表
- 【深度学习看手相】台湾学生获奖 AI 项目是科学还是伪科学? 搜狐科技 08-06 12:44 1新智元报道 来源: medium,facebook 编译:胡祥杰 张易 【新智元导读】本周日带来一个有
- 腾讯发布 2019 年研发报告:新增 12.9 亿行代码,74% 技术 Leader 仍在写代码
- 人脸静默活体检测最新综述
- amazeui学习笔记一(开始使用4)--Web App 相关
- UIImageView圆角,自适应图片宽高比例,图片拉伸,缩放比例和图片缩微图
- xcode 4.2下怎么添加framework?
- 【转】接口测试面试题
- 问世间最大的乐趣是什么?
- vb读取mysql数据库数据_VB读取ORACLE数据库的两种方法
- 叶三《我们唱》-野孩子(白银饭店)
- 《请君入瓮——APT攻防指南之兵不厌诈》—第8章8.5节安全贵在未雨绸缪
- Unity免费资源汇总
- Axure RP9使用指南
- MongoDB Mobile Sync for iOS推出Beta版本
- linux技术发展方向,linux技术的发展方向有哪些?Linux运维入门
- PTA 硬币找钱问题
- Chapter 2 Multi-armed Bandits 学习总结
- linux卸载exe文件怎么恢复,linux中误删除程序包恢复实例