有一连串的数字即将到来。在任何时候,我都可能需要10%的随机数。我显然不想存储整个流。
更大的问题是我正在考虑上面的算法。我有很多数据(基于时间戳)进入数据库。现在我还想建立一个示例表,它包含了主数据库表中10%的记录,但是是随机的,所以如果想要快速查询,我可以用很少的不准确来快速查询。我分批收到消息(号码),说有时是100,有时是20,有时是5等等。
我在想,我会在流媒体的时候这样做,这是问题所在。有人能为此提出一个好的算法吗?有没有更好的方法?
发布于 2013-05-22 23:56:55
如果您想要在传入流上模拟一个真正随机的10%样本,您可以使用均值为9的Poisson Distribution来决定在记录下一个条目之前跳过多少个条目。不过,设置一个上限可能是个好主意,这样你就不会在数据中出现罕见的、但可以预见的巨大差距。
发布于 2013-05-23 13:04:58
公式
下面是我如何阐述这个问题的。让你的(可能无限的)序列中的项为i=1,2,...。假设您想从序列中获取大约0 < z < 1项,以生成更稀疏的序列。让x(i)表示我们是否在生成的稀疏序列中包含项i。
对于任何包含n个连续项目的窗口(在其中选择n >= 1),您希望项目的预期数量为z*n,但可能会与该预期有所不同。为此,您可以使用具有均值z*n和标准差d的(截断)二项分布(link) (其中您选择d > 0)。(它在右边被截断了,因为当只有n需要考虑时,您不可能选择超过n的项目!您还可以在左侧将其截断为“我总是希望每个n中至少有m项,其中m比z*n小得多,但我假设您跳过了这一步。”
现在,您可以根据是否包含每个n-1前面的项i-1,i-2,...,i-(n-1)来确定在生成的稀疏序列中包含项i的概率
A = P( x(i) = 1 | x(i - j), 1 <= j < n )这一切意味着什么?
在这个公式中,你选择了三个数字:
0 < z < 1 z = 0.1
z指定为10%,即
n >= 1和patternn = 1 n看作是窗口大小,并将看作是从常规采样到更嘈杂的采样的偏差量。pattern
n = 1意思是“包括具有概率的每一项,而不管其他项是否被包括在稀疏sequencen = 100, d = 0.0001中”,除非在极其罕见的情况下,在稀疏序列中的每个连续的D51中包括D50项“F152i >H153z >如果您使D54非常小,你基本上是在说“在一个常规的pattern"中选择每一项1/z”
- `n = 100, d = 5` means "include roughly `5` to `15` out of each consecutive `100` items in the sparser sequence"
发布于 2013-05-23 00:02:32
以评论中的例子为例:
在这种情况下,您可以跟踪每个时间间隔内传入的数据总数--例如,餐厅每半小时营业一次。(或者甚至只是一个0到9的计数器,当您达到10时,该计数器将重置为零。)
抓起你在每个时间间隔内看到的第一个,让九个掉在地板上。
冲洗并重复,你应该为每个时间间隔建立一个好的10%的采样。
https://stackoverflow.com/questions/16696138
复制相似问题