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

时间:2013-05-22 15:43:51

标签: database algorithm postgresql hadoop

有一串数字即将来临。在任何时候我可能需要10%的随机数。 我显然不想存储整个流。

更大的问题是我正在考虑上述算法。 我有很多数据(基于时间戳)进入数据库。现在我还想构建一个示例表,其中包含主数据库表中10%的记录,但随机,所以如果想快速查询,我很好,几乎不准确,我可以快速查询。 我分批收到消息(数字)说有时100,有时20有时等等。

我想我会在流式传输时执行此问题。 有人可以建议一个很好的算法。 有没有更好的办法 ?

3 个答案:

答案 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 >= 1d > 0
    • n视为窗口大小
    • d视为从常规抽样到更嘈杂的抽样模式的偏差量
    • n = 1表示“包含概率为i的每个项z,与其他项目是否包含在稀疏序列中无关
    • n = 100, d = 0.0001表示“除极少数情况外,在稀疏序列中的每个连续10个项目中包含100
      • 如果你使d非常小,你基本上会说“以常规模式选择每个1/z项”
    • n = 100, d = 5表示“在稀疏序列中的每个连续5项目中大致包含15100

答案 2 :(得分:0)

在评论中举例:

  • 数据之间没有相关性。
  • 您想要在一天中的特定时间进行抽样。

在这种情况下,您可以跟踪每个时间间隔内通过的数据总数 - 例如,餐厅每半小时开放一次。 (或者甚至只是一个0到9的计数器,当你达到10时,它会重置为零。)

抓住你在每个时间间隔看到的第一个,让九个掉在地板上。

冲洗并重复,你应该为每个时间间隔建立10%的良好采样。