【问题标题】:Efficiently building a thresholded similarity graph有效地构建阈值相似图
【发布时间】:2016-04-18 21:47:37
【问题描述】:

阈值相似度图是一组节点和边,如果两个节点之间的相似度高于给定阈值,则节点通过边连接。

构建这样的n 节点图很容易:创建一个n x n 矩阵M,将每个节点放在列和行中,然后用节点@987654329 之间的相似性填充每个单元格C[i,j] @ 和节点 j 如果结果高于给定阈值。这里的复杂度显然是O(n^2)

如果i == j,或者如果C[j, i] 已经被计算(假设节点ij 之间的相似性,计算C[i, j]与节点ji 之间的相似度相同)。但是,当时O(n * (n - 1) / 2) 的复杂度仍然等同于O(n^2)

鉴于所使用的相似度函数是 metriccosine similarity(尽管此信息可能不相关),有没有办法计算这种复杂度比 O(n^2) 更好的阈值相似度图?

谢谢, 罗曼。

【问题讨论】:

  • 我不这么认为,这就是例如在Near Duplicates Detection(对于搜索引擎)中我们使用完全不同的方法的原因,而不是经典的余弦相似度 - 因为余弦相似度非常当语料库包含数十亿个文档时,很难计算这些。
  • 我认为您真正想要的是一种在小于 O(n^2) 的空间内隐式表示这样一个图的方法。这会很棘手,因为标准表示是邻接矩阵(总是 O(n^2) 空间)和邻接表,完整图的空间是 O(n^2) ——当然有可能有一个完整的图作为阈值图。不过还是有可能的。
  • @j_random_hacker 我实际上是在寻找 时间 复杂性。对于我的目的,我不介意 O(n^2) 空间 复杂度。
  • @amit 您说的是搜索引擎中使用的哪种方法? (尽管任何一行都将不胜感激。)您链接的帖子中解释的 jaccard 索引仍然需要在所有文档对(或节点)之间进行操作,这在处理数百万个文档时似乎是不可能的。
  • @RomainG 我在这个答案中提供的链接显示了一种有效的方法来计算它而无需遍历每一对(当然在最坏的情况下你必须这样做,但通常你不会) .具体来说,我说的是this link,以及部分:Algorithm for Clustering Near-Duplicate Documents(第9页)。如您所见,要计算 Jaccard 相似度,您不需要遍历所有对。

标签: algorithm graph time-complexity complexity-theory


【解决方案1】:

我认为你可以用复杂的O(m) 来做到这一点,其中 m 是边数。如果 i 和 j 之间的边不存在,那么您不必将结果放入新图中。即使使用矩阵表示,也可以实现O(m),如果您使用稀疏矩阵表示或邻接列表。

当然在像你这样的一些(不是那么特殊的)案例中,m = n^2

【讨论】:

    【解决方案2】:

    总结上面的讨论,实际上并没有任何方法可以回答我的问题。正如@j_random_hacker 所提到的,用于图形存储的每个字节至少被读取或写入一次。图的空间复杂度在最坏情况下为O(n^2),无法再优化时间复杂度。

    @amit 建议以概率的方式使用 Jaccard 相似性,正如this link 中所解释的那样找出近似重复,但这似乎不适用于余弦相似性,并且仅适用于文本数据(不是文档-向量)。

    另一种方法,不是降低算法的复杂性而是更快地创建图形,是使用 GPU 进行并发编程。这可能有助于用大一到两个数量级的数据集构建这样的图。任何对此感兴趣的人都应该研究 CUDA 或 OpenCL。

    【讨论】:

      猜你喜欢
      • 2016-08-16
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 2012-08-25
      • 2010-09-26
      • 2023-03-23
      • 1970-01-01
      • 2021-04-27
      相关资源
      最近更新 更多