从无限流中选择10%随机数

i34xakig  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(466)

有一连串的数字要来。在任何时候我都可能需要10%的随机数。我显然不想存储整个流。
更大的问题是我在想上面的算法。我有很多数据(基于时间戳)进入数据库。现在我还想建立一个示例表,其中包含主数据库表中10%的记录,但是是随机的,这样,如果我想快速查询,并且不存在任何错误,我就可以快速查询。我收到信息(数字)成批说,有时100,有时20,有时5等。
我在想,我会做这件事,而流的问题表明。有人能提出一个好的算法吗。有更好的办法吗?

jtjikinw

jtjikinw1#

配方

下面是我将如何表述这个问题。让您的(可能无限)序列中的项 i=1,2,... . 假设你想 0 < z < 1 对序列中的项进行排序,以生成更稀疏的序列。让 x(i) 表示我们是否包括 i 在我们生成的稀疏序列中。
任何一扇Windows n 连续项目(您选择的位置) n >= 1 ),您希望项目的预期数量为 z*n ,但有可能与预期有所不同。为此,您可以使用(截断)二项分布(链接)与平均值 z*n 和标准差 d (你在哪里挑选 d > 0 ). (它在右边被截断了,因为您不可能选择超过 n 当只有 n 考虑一下!你也可以删去左边的“我一直想要至少 m 每项中的项 n ,在哪里 m 远小于 z*n ,但我想你可以跳过这个。)
现在,您可以确定包含该项的概率 i 在稀疏序列中,根据是否包含每个 n-1 前面的项目 i-1,i-2,...,i-(n-1) :

A = P( x(i) = 1 | x(i - j), 1 <= j < n )

这一切意味着什么?

按照这个公式,你可以选择三个数字: 0 < z < 1 在你的问题中,你已经指明 z 10%——即。,
z = 0.1 n >= 1 以及 d > 0 想想 n 作为窗口大小
想想 d 从常规采样到噪声较大的采样模式的偏差量 n = 1 意思是“包括所有项目 i 以概率 z ,与稀疏序列中是否包含其他项无关 n = 100, d = 0.0001 意思是“除极少数情况外,包括 10 在每个连续的 100 “稀疏序列中的项目”
如果你能 d 非常小,你基本上是说“选择每一个 1/z 第四项,有规律地 n = 100, d = 5 意思是“大致包括 515 在每个连续的 100 “稀疏序列中的项目”

dzhpxtsq

dzhpxtsq2#

简单的解决方案是只保存每10个传入的数据点,但这可能会导致有偏见的结果取决于数据的随机性。
如果您想模拟传入流上真正随机的10%样本,可以使用平均值为9的泊松分布来决定在记录下一个条目之前要跳过多少个条目。不过,设定一个上限可能是个好主意,这样你就不会在数据中出现罕见但可以预见的巨大差距。

tct7dpnv

tct7dpnv3#

以你的评论为例:
数据之间没有相关性。
你需要在一天中的特定时间取样。
在这种情况下,您可以跟踪在每个时间间隔(例如,餐厅每半小时营业)内通过的数据总数(或者仅仅是一个0到9的计数器,当你达到10的时候会重置为0。)
抓住你在每个时间间隔看到的第一个,让9滴在地板上。
冲洗和重复,你应该建立一个良好的10%的取样时间间隔。

相关问题