考虑到大型矩阵,下面的代码效率很低。有没有更好的方法来实现这一目标?

我已经在网上搜索了此here

import numpy as np

def cosine_similarity(x, y):
    return np.dot(x, y) / (np.sqrt(np.dot(x, x)) * np.sqrt(np.dot(y, y)))

def compare(a, b):

    c = np.zeros((a.shape[0], b.shape[0]))

    for i, ai in enumerate(a):
        for j, bj in enumerate(b):
            c[i, j] = cosine_similarity(ai, bj)

    return c

a = np.random.rand(100,2000)
b = np.random.rand(800,2000)

compare(a,b) # shape -> (100, 800)

最佳答案

如注释中所述,如果要取两个矩阵的乘积,则numpy已经对此进行了有效的实现,但对您来说可能太慢了(O(n ^ 3))。

import numpy as np

a=np.array([3,2,1])
b=np.array([1,2,3])
c=a.dot(b)
print(c) #output = 10


我在评论中看到您对向量之间的余弦距离感兴趣。对于余弦相似性,请考虑使用Scipy:

from scipy.spatial.distance import cosine

a=[1,0,1]
b=[0,1,0]
print(cosine(a,b)) #output = 1.0


这可能会更快满足您的需求。这是documentation

关于python - 在Python中实现按元素的余弦相似度的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56939272/

10-12 23:17