不使用random()进行采样?

时间:2015-11-14 15:44:23

标签: algorithm sampling

我最近被要求实现一个sampleStream()方法,该方法将以相同的概率选择每个元素,但不使用random()。我认为采访者正在寻找水库采样,但当我偶然发现它时,他补充说这是一种叫做“stratified sampling”的方法。不可否认,我可能已被抛弃了,因为有一种称为分层抽样的统计方法,我试图想出如何使用它来从流中抽样元素而不是随机的。他指定的输入是要采样的项目数,以及我应该采样的速率(类似于1000 / 100,000)。

无论如何,我仍然坚持这个问题,即使我已经没有得到正确回答它的工作。谷歌搜索在这里失败了。任何人都可以帮我理解吗?

1 个答案:

答案 0 :(得分:2)

实现分层抽样的一种方法是按照用于分层的密钥对列表进行排序,然后进行1次n次抽样。

从技术上讲,如果密钥是类别,则排序是不必要的。在这种(典型的)情况下,可以使用散列方法。这个想法仍然是相同的:在" n"列表。

也许这就是采访者所指的。

编辑:

你可以在流上实现分层抽样,你基本上是在阅读流并做一个"桶"计算每组相似的键值。当存储桶具有某个任意值时,您将输出该记录。当桶达到某个值(基于整体频率)时,您将重置计数器并重复(或使用模运算)。

然而,这并不具有获得每条记录的相同概率。为此,我确实认为你需要某种随机化。接近的方法是将每个组的记录存储在存储桶中,然后在存储桶已满时选择随机记录。您可以通过在某个其他值(例如插入时间)上使用散列键来模拟随机性,然后选择最小或最大散列键值。 (而且,只需存储一条记录,就可以提高效率。)