Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 提高了算法的时间复杂度_Python_Time Complexity_Cosine Similarity - Fatal编程技术网

Python 提高了算法的时间复杂度

Python 提高了算法的时间复杂度,python,time-complexity,cosine-similarity,Python,Time Complexity,Cosine Similarity,我有N对字符串列表(从集合1到集合2各N对),需要通过Jaccard相似度与最接近的字符串列表配对。这意味着我需要计算N^2个距离,取集合1中每个元素的最大相似度w.r.t.集合2 运行它的简单代码如下 import numpy as np def jaccard_similarity(a, b): intersection = set(a).intersection(set(b)) union = set(a).union(set(b)) return len(int

我有N对字符串列表(从集合1到集合2各N对),需要通过Jaccard相似度与最接近的字符串列表配对。这意味着我需要计算N^2个距离,取集合1中每个元素的最大相似度w.r.t.集合2

运行它的简单代码如下

import numpy as np

def jaccard_similarity(a, b):
    intersection = set(a).intersection(set(b))
    union = set(a).union(set(b))
    return len(intersection)/len(union)

set_1 = [['Pisa','Tower','River','Tuscany'],['London','City','UK','England'],['Berlin','Germany','Munich']]
set_2 = [['Pisa','Arno','River','Tuscany','Florence','London','Tower'],['Germany','German','UBanh'],['London','City','UK','England','Europe']]

pairs = []

for vect_1 in set_1:
    dist = []
    for vect_2 in set_2:
        dist.append(jaccard_similarity(vect_1,vect_2))
    pairs.append(np.argmax(dist))

print(pairs)
我知道这有O(N^2)时间复杂度,但我想知道是否有一些优化/启发式,这样平均情况会更好

类似地,我是否可以优化代码本身


编辑:我修改了问题以使其更精确。

您应该能够使用scipy.space.distance.cdist,它计算给定度量的整个矩阵。时间复杂性是不可避免的,但scipy使其变得更快


我不确定你是否能得到比O(N^2)更好的结果(到一天结束时,你仍然需要将每个向量与另一个向量进行比较),但是你肯定可以通过使用
itertools.product
而不是嵌套循环使O(N^2)更快。这至少会将迭代推进到C级。也可以利用一些numpy矢量化。你能提供一些输入和输出的例子吗?一般来说,我不认为你能比O(N^2)更快,除非你在一个小的维度上工作。但是你可以通过预处理加速代码:规范所有向量并考虑它们的内积作为度量值。我编辑了这个问题。更准确地说,我是在处理一组单词的Jaccard距离。现在有一个MWE。我编辑了这个问题。Cdist似乎是一个很好的机会,但正如我现在在问题中提出的,我正在处理单词列表和Jaccard距离。Cdist需要的是数字向量。