使用一组样本估计多组交集的大小

机器算法验证 错误 样本
2022-03-25 23:35:48

我正在研究一种算法,该算法需要计算由至少 2 个集合的交集生成的集合的大小。进一步来说:

z=|A0An|

相交的集合是由 SQL 查询生成的,为了保持速度,我提前对每个查询进行计数,然后取计数最低的集合 ( ) 并将这些 ID 用作其余的大查询,因此交集有效地变为:A0

z=|(A0A1)(A0An)|

即使这个策略也让我有一些相当大的查询要运行,因为有时可能很大。我处理这个问题的想法是随机抽取样本并将其与其余集合相交,然后再推断回对的正确估计。我的问题是:进行采样然后推断返回到值的最佳方法是什么,即,如果不完全准确,具有可预测的误差范围?|A0|A0zz


这是我迄今为止尝试过的(在伪代码中):

sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
    factor = sample_threshold / len(A0)
}

// Take a random sample of size 10000 from A0

// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
    a = intersect(A0, a)
    working_set = intersect(working_set, a)
}

z := len(working_set) * (1 / factor)

此代码有效,但似乎始终高估z,样本量越小,估计值越高。此外,我不确定这将如何与两个以上的集合相交。

我希望这个问题是有道理的,让我知道是否可以进一步澄清。另外,如果这个问题离题或属于其他地方,请告诉我,我很乐意移动它。


根据比尔的评论,我进行了一些快速试验以显示样本量与错误。每个样本大小的存储桶运行 20 次,您可以看到有一个非常明显的趋势:

阴谋

2个回答

如果您的集合具有重复的元素(即,它实际上是一个多重集),则您的程序将高估交集的大小,因为您的缩放因子使用采样的元素数量,而不是采样的唯一“类型”数量。您可以通过将因子计算为随机样本中唯一元素数与完整集合中唯一元素数之比来更正估计值。A0A0

正如Inno 指出的那样,我的问题是因为我的采样集中有重复项,这导致我的伪代码太低,这反过来又导致最终的外推太高,因为它是通过. 删除重复项解决了这个问题,现在算法生成了一个增量与样本量图,更符合我的预期(这些线表示该样本量相对于总人口在 95% 置信水平下的误差幅度):A0factorzfactor

阴谋