有一串数字即将来临。在任何时候我可能需要10%的随机数。 我显然不想存储整个流。
更大的问题是我正在考虑上述算法。 我有很多数据(基于时间戳)进入数据库。现在我还想构建一个示例表,其中包含主数据库表中10%的记录,但随机,所以如果想快速查询,我很好,几乎不准确,我可以快速查询。 我分批收到消息(数字)说有时100,有时20有时等等。
我想我会在流式传输时执行此问题。 有人可以建议一个很好的算法。 有没有更好的办法 ?
答案 0 :(得分:2)
简单的解决方案是只保存每第10个传入数据点,但这可能会导致偏差结果,具体取决于数据的随机性。
如果要在传入流上模拟真正随机的10%样本,可以使用Poisson Distribution(平均值为9)来确定在记录下一个条目之前要跳过的条目数。设置一个上限可能是一个好主意,所以你不会在数据中出现罕见且可预测的大差距。
答案 1 :(得分:1)
以下是我将如何制定问题。让您(可能是无限的)序列中的项目为i=1,2,...
。假设您想从序列中获取大约0 < z < 1
项,以生成更稀疏的序列。让x(i)
表示我们是否在我们生成的稀疏序列中包含项i
。
对于n
个连续项目(您选择n >= 1
)的任何窗口,您希望预期的项目数为z*n
,但是某种方差的可能性。为此,您可以使用(截断的)二项分布(link),其平均值为z*n
,标准差为d
(您选择d > 0
)。 (它被截断在右边,因为当只考虑n
时,你不可能选择超过n
个项目!你也可以在左边截断它来说“我总是想要< em>至少 m
个项n
,其中m
远小于z*n
,但我会假设你跳过它。)< / p>
现在,您可以根据是否已包含每个i
前面的项目n-1
来确定应该在您生成的稀疏序列中包含项i-1,i-2,...,i-(n-1)
的概率:< / p>
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
表示“在稀疏序列中的每个连续5
项目中大致包含15
到100
”答案 2 :(得分:0)
在评论中举例:
在这种情况下,您可以跟踪每个时间间隔内通过的数据总数 - 例如,餐厅每半小时开放一次。 (或者甚至只是一个0到9的计数器,当你达到10时,它会重置为零。)
抓住你在每个时间间隔看到的第一个,让九个掉在地板上。
冲洗并重复,你应该为每个时间间隔建立10%的良好采样。