在嘈杂数据中查找公共集

时间:2009-12-17 17:55:58

标签: algorithm language-agnostic

上下文:将G中的每个集合视为特定计算机上找到的文件(内容或MD5哈希,而不是名称)的集合。

假设我有一个庞大的巨型集合列表G以及一组未知的集合HI中的每个单独的集G都是通过从列表H中获取一些未知数量的集合,然后添加和删除未知数量的元素来创建的。

现在,我可以使用其他数据构建列表H中的一些集合。但是,我觉得可能会有某种涉及Bayesian probability的技术来执行此操作。例如。例如,“如果在X内的集合中找到G表示同时找到Y的概率很高,那么H中可能包含X {1}}和Y。“

编辑:我的目标是构建一组很有可能非常相似或等于H的集合。

有什么想法吗?

使用示例:

通过用G的片段替换它的块来压缩H,例如

G[1]  = {1,2,3,5,6,7,9,10,11}
H[5]  = {1,2,3}
H[6]  = {5,6,7,8,9,10}
G[1]' = {H[5],H[6],-8,11}

4 个答案:

答案 0 :(得分:3)

定义距离d(i,j)= 1 /(G中包含i和j的集合数)然后运行聚类分析。(http://en.wikipedia.org/wiki/Cluster_analysis)生成的聚类是您的候选者H中的元素。

答案 1 :(得分:0)

有很多非聪明的 ad hoc 攻击方式。这是一个。

首先从G中随机抽取样本,比如64集。

对于这些集合中的每个文件,构造一个64位整数,告诉它出现在哪个集合中。

按此64位值对文件进行分组;所以总是一起出现的所有文件最终都在同一个组中。查找具有最大值的组((组中的文件数 - 1)×(位向量中设置的位数 - 1))并调用H [0]。

现在将样本扔回去并取一个新的随机样本。使用您已定义的H [0]尽可能多地减少它。然后应用相同的算法找到H [1]。冲洗。重复。

当额外的H不再帮助你压缩套装时停止。

改进此算法:

  • 您可以轻松选择一种稍微不同的衡量群体优良度的方法,这些群体可以推广附近有很多邻居的群组 - 中出现的文件几乎相同的一组。
  • 您还可以非常轻松地根据G中的随机样本测试现有的H,以查看是否有应考虑添加或删除的文件。

答案 2 :(得分:0)

嗯,目前的临时方式似乎还不错,如下:

  • 从所有G_x中移除25集以内的所有元素。
  • 创建从元素到集合以及从集合到元素的映射。
  • 对于元素图中的每个元素E,选择3个集并取其交集。制作两份副本,AB
  • 对于不包含S的集合地图中的每个集E,请从SA中删除B的所有元素(在它们之间切换) )
  • Union(A,B)添加到H
  • 从元素中删除所有元素`Union(A,B)以设置地图(即找不到重叠集)。

答案 3 :(得分:0)

确定性方式如何(如果你不希望集合相交): A)将H中的集合转换为标记为1,2,3,...大小(H)的顶点。在它们之间创建一个完整的[un]有向图。每个顶点都有一个值 - 等于集合的基数/大小。 B)遍历H中的所有元素x,创建映射x - &gt; [x1,x2,... xm]当且仅当x在H [xi]中时。一组数组都可以。这有助于您找到重叠集。 C)遍历此数组中的所有集合,对于同一集合中的每对x1,x2 - 消除x1和x2之间的两条边。 D)在剩余的图中只有非重叠集(好吧,它们的指数在H中)。 E)现在在该图中找到具有最高总值的非相交路径。从中您可以重建具有最高覆盖范围的非相交集列表。计算缺失的元素是微不足道的。 F)如果要最小化剩余集合的基数,则从每个顶点的值中减去0.5。我们知道1 + 1 = 2,但0.5 + 0.5 <1。 1.5 - 因此算法优先选择{a,b}而不是{a}和{b}。这可能不是您想要的,但它可能会使您失效。