我正在研究一种算法,该算法需要计算由至少2个集合的交集生成的集合的大小。进一步来说:
相交的集合是由SQL查询生成的,为了保持运行速度,我提前获取了每个查询的计数,然后以计数最小()的集合为准,并使用这些ID作为其余的大查询,因此交集实际上变为:
即使这个策略也让我有一些相当大的查询要运行,因为有时可能很大。我要解决的想法是随机抽取样本,并将其与其余集合相交,然后外推回的适当估计。我的问题是:进行采样然后外推以返回到值(如果不是完全准确的话)具有可预测的误差范围的最佳方法是什么?
到目前为止,这是我尝试过的(使用伪代码):
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
,较小的样本量会产生较高的估计。另外,我不确定如何将两个以上的集合相交。
我希望这个问题有意义,请让我知道是否可以进一步澄清。另外,如果这个问题不在主题范围内或属于其他地方,请告诉我,我很乐意提出。
根据Bill的评论,我进行了一些快速试验,以显示样本量与误差的关系。每个样本数量存储桶运行20次,您可以看到有一个非常明显的趋势:
我认为无需替换的简单随机抽样应该有效。我对你被高估感到困惑。看起来它正好映射为使用随机样本中的样本均值估算总体均值。您正在尝试估计的元素与其他 s 相交的总体概率。我已经举了一个简单的例子,它很好用。您如何确定自己始终被高估?它发生了20次中的15次还是200次中的150次?样本真的是随机的吗?
—
条例草案
@Bill我添加了一个样本数量与误差的曲线图,该曲线图说明了我所看到的。大约是20的20倍。至于随机样本,它与一样随机
—
Jimmy Sawczuk 2014年
ORDER BY RAND()
,虽然并不完美,但应该适合此任务。
@JimmySawczuk将“工作集”直接与“ a”相交而不是“ intersect(A0,a)”而不是直接相交会更好吗?因为“ A0”可能会在首次运行后大于算法中当前的“工作集” ...我是否正确理解了这一点?
您能否确认您实际上是指集合而不是多集合(即,集合中没有重复项)?因为,如果有的话,很容易通过您的方法高估“交叉点”的大小。(考虑一下只是同一元素的100个副本,而您采样了其中一半的情况。)
—
Innuo