【发布时间】:2016-04-18 21:47:37
【问题描述】:
阈值相似度图是一组节点和边,如果两个节点之间的相似度高于给定阈值,则节点通过边连接。
构建这样的n 节点图很容易:创建一个n x n 矩阵M,将每个节点放在列和行中,然后用节点@987654329 之间的相似性填充每个单元格C[i,j] @ 和节点 j 如果结果高于给定阈值。这里的复杂度显然是O(n^2)。
如果i == j,或者如果C[j, i] 已经被计算(假设节点i 和j 之间的相似性,不计算C[i, j]与节点j 和i 之间的相似度相同)。但是,当时O(n * (n - 1) / 2) 的复杂度仍然等同于O(n^2)。
鉴于所使用的相似度函数是 metric 或 cosine 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