Database 从无限流中选择10%的随机数
有一连串的数字。在任何时候,我都可能需要10%的随机数。 我显然不想存储整个流 更大的问题是我在考虑上面的算法。 我有很多数据(基于时间戳)进入数据库。现在,我还想构建一个示例表,其中包含主数据库表中10%的记录,但是是随机的,这样,如果想要快速查询,并且我没有什么不准确的地方,我可以快速查询。 我收到的信息(数字)成批说,有时100,有时20,有时5等 我在想我会在流媒体播放的时候做这件事,这个问题表明了这一点。 有人能提出一个好的算法吗。Database 从无限流中选择10%的随机数,database,algorithm,postgresql,hadoop,Database,Algorithm,Postgresql,Hadoop,有一连串的数字。在任何时候,我都可能需要10%的随机数。 我显然不想存储整个流 更大的问题是我在考虑上面的算法。 我有很多数据(基于时间戳)进入数据库。现在,我还想构建一个示例表,其中包含主数据库表中10%的记录,但是是随机的,这样,如果想要快速查询,并且我没有什么不准确的地方,我可以快速查询。 我收到的信息(数字)成批说,有时100,有时20,有时5等 我在想我会在流媒体播放的时候做这件事,这个问题表明了这一点。 有人能提出一个好的算法吗。 有更好的办法吗 简单的解决方案是只保存每10个传入数
有更好的办法吗 简单的解决方案是只保存每10个传入数据点,但这可能会导致偏差结果,具体取决于数据的随机性
如果要在传入流上模拟真正随机的10%样本,可以使用平均值为9的来决定在记录下一个条目之前要跳过多少个条目。不过,设定上限可能是个好主意,这样你就不会在数据中出现罕见但可以预见的巨大差距。以你的评论为例:
- 数据之间没有相关性
- 您需要在一天中的特定时间采集样本
i=1,2,…
。假设您想从序列中提取大约0
,以生成一个更稀疏的序列。让x(i)
表示我们是否在生成的稀疏序列中包含项i
对于n
连续项目的任何窗口(您选择n>=1
),您希望项目的预期数量为z*n
,但可能与该预期存在一些差异。为此,您可以使用(截断的)二项分布,其平均值z*n
和标准偏差d
(在此处选择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=1
和d>0
- 将
视为窗口大小n
- 将
视为从常规采样到更嘈杂采样模式的偏差量d
表示“以概率n=1
包含每个项目z
,与其他项目是否包含在稀疏序列中无关i
表示“除极少数情况外,将n=100,d=0.0001
从每个连续10
项目中以更稀疏的顺序包括在内”100
- 如果你把
做得非常小,你基本上是说“按规则选择每个d
th项”1/z
- 如果你把
表示“从稀疏序列中的每个连续n=100,d=5
项目中大致包含100
到5
”15
我会确保您准确地理解流是如何“随机”的。白噪声是随机的,还是一个数字与下一个数字之间存在相关性(即使它是不可预测的)?如果存在相关性,并且您每次获取10%的100个数字,那么样本可能无法代表您想要的。这些数字没有任何关联,说它们都是客户在Restranur花费的时间。因此,我想询问在特定时间间隔之间,在Restranur花费的平均时间是多少,因为我的正常表是pretty large,我想对采样数据进行处理。一次获取10%的问题是,如果我总是在批处理中收到少于10%的消息,那么10%的消息总是会被捕获null@Peter对于一个你可以微调的数学模型,一定要看看我下面的答案。我认为它解决了你到目前为止提出的所有问题e random,你以1种方式每10个样本一次,这相当于对每一个项目单独说,“保持概率为0.1。”——“模拟一个真正随机的10%样本”有点言过其实,尽管我同意它仍然比每10个项目的常规抽样“更随机”。
A = P( x(i) = 1 | x(i - j), 1 <= j < n )