阈值相似性图是一组节点和边,如果两个节点之间的相似性高于给定阈值,则节点通过边连接。
构建n
节点的此类图表非常简单:创建n x n
矩阵M
,将每个节点放在列和行中,然后填充每个单元格C[i,j]
如果结果高于给定阈值,则节点i
和节点j
之间具有相似性。这里的复杂性显然是O(n^2)
。
如果C[i, j]
计算i == j
,或者已经计算C[j, i]
,则不计算i
可以略微提高这种复杂性(假设节点之间的相似性{ {1}}和j
与节点j
和i
之间的相似度相同。但是,O(n * (n - 1) / 2)
的复杂性仍然等同于O(n^2)
。
鉴于所使用的相似度函数是metric或cosine similarity(虽然此信息可能不相关),是否有办法计算这样的阈值相似度图,其复杂度优于O(n^2)
?
谢谢, 罗曼。
答案 0 :(得分:1)
我认为你可以用复杂性O(m)
来做到这一点,其中m是边数。如果i和j之间的边缘不存在,那么您不必将结果放在新图表中。即使使用矩阵表示,如果使用稀疏矩阵表示或邻接列表,也可以实现O(m)
。
当然,在像你这样的一些(并非如此例外)的情况下,m = n^2
。
答案 1 :(得分:0)
总结上面的讨论,实际上对我的问题没有任何回答。正如@j_random_hacker所提到的,用于图存储的每个字节至少被读或写一次。在最坏的情况下,图表的空间复杂度为O(n^2)
,无法再优化时间复杂度。
@amit建议以概率方式使用Jaccard相似性,如this link所述,以找出近似重复,但这似乎与余弦相似性无关,只能用于文本数据(不是文件向量)。
另一种方法是,不降低算法的复杂性,而是更快地创建图形是使用GPU进行并发编程。这可能有助于构建具有一个或两个数量级更大数据集的图形。任何有兴趣的人都应该为此目的研究CUDA或OpenCL。