对聚合数据集进行采样

时间:2018-05-18 22:04:43

标签: random statistics probability statistical-sampling

输入是一个数据集,其中每一行都包含一个事件,比如点击。会员ID是唯一ID。 样本数据: M1,100 M2,100 M3,50 M4,50 目标是抽取1%的点击次数,通过总计所有成员ID的所有点击次数来获得总点击次数。 如果我希望在样本数据集上采样1%,我希望应用一种随机抽样点击计数并产生1%或3次点击的技术,例如: M1,1 M2,1 M4,1 或其他组合,其中成员的点击总和为1%。

一种基本方法是爆炸输入中的所有条目并将其作为数据,然后从中抽取1%。如果有数百万成员拥有100次点击次数,那么这将非常缓慢/效率低下。在不需要数据爆炸的情况下寻找更好的解决方案?

1 个答案:

答案 0 :(得分:1)

似乎显而易见的是从用户那里抽样,每个用户的概率与他们的点击次数成比例,然后为给定用户随机选择一个点击。在您给出的示例中,这意味着选择概率为100 / 300,100 / 300,50 / 300和50/300的用户,然后从给定用户中选择一个单击。

您可以通过生成0到1之间的随机数p然后找到最小的k(k = 1,2, 3,... #weights)使得从1到k的权重之和小于或等于p。

找到k的有效方法是构造权重的部分和的列表(即0,w1,w1 + w2,w1 + w2 + w3,...)然后执行二分搜索(非线性)在那个名单上。二进制搜索将产生每个样本的时间,其与权重的数量(在您的情况下为用户)呈对数增长,而线性搜索产生线性增长。

编辑:一个例子。给定n = 10个用户,分别具有N =(100,160,200,20,500,550,400,300,120,80)个事件。总事件数= 2430,权重w =(10 / 243,16 / 243,20 / 243,2 / 243,50 / 243,55 / 243,40 / 243,10 / 8,4 / 8,8 / 243) 。权重的部分和S =(0,10 / 243,26 / 244,46 / 243,16 / 81,98 / 243,17 / 27,193 / 243,223 / 243,235 / 243,1)。 (注意:之前我错了;序列应该是(0,w1,w1 + w2,w1 + w2 + w3,...,w1 + ... + w [n - 1],1)。)

给定0和1之间的随机数x,找到(通过二分搜索)部分和的索引,使得S [i]< = x< S [i + 1]。然后从用户i的N [i]事件中随机均匀地选择事件。

我假设您可以执行二进制搜索和每用户事件的采样,因此我不会写出该部分。

EDIT2:修正了部分和列表的公式。该列表有n + 1个元素;搜索i使得S [i]< = x<因此,S [i + 1]将产生i = 1,2,3,...,n。假设随机数始终小于1,则不会选择最后一个元素1。