两个矩阵之间的余弦相似度计算

7

我有一段代码用于计算两个矩阵之间的余弦相似度:

def cos_cdist_1(matrix, vector):
    v = vector.reshape(1, -1)
    return sp.distance.cdist(matrix, v, 'cosine').reshape(-1)


def cos_cdist_2(matrix1, matrix2):
    return sp.distance.cdist(matrix1, matrix2, 'cosine').reshape(-1)

list1 = [[1,1,1],[1,2,1]]
list2 = [[1,1,1],[1,2,1]]

matrix1 = np.asarray(list1)
matrix2 = np.asarray(list2)

results = []
for vector in matrix2:
    distance = cos_cdist_1(matrix1,vector)
    distance = np.asarray(distance)
    similarity = (1-distance).tolist()
    results.append(similarity)


dist_all = cos_cdist_2(matrix1, matrix2)
results2 = []
for item in dist_all:
    distance_result = np.asarray(item)
    similarity_result = (1-distance_result).tolist()
    results2.append(similarity_result)

results is

[[1.0000000000000002, 0.9428090415820635],
                     [0.9428090415820635, 1.0000000000000002]]

然而,results2[1.0000000000000002, 0.9428090415820635, 0.9428090415820635, 1.0000000000000002]

我的理想结果是 results,这意味着结果包含相似性值的列表,但我想保持矩阵之间的计算而不是向量和矩阵之间的计算,有什么好的想法吗?


你能够将矩阵列进行归一化处理,然后AB'就会成为相似矩阵。使用np.dot(A,B.T)。 - Scott
感谢您的评论,但我必须保持矩阵不变,因为它还有其他含义。 - gladys0313
3个回答

19
In [75]: import scipy.spatial as sp
In [76]: 1 - sp.distance.cdist(matrix1, matrix2, 'cosine')
Out[76]: 
array([[ 1.        ,  0.94280904],
       [ 0.94280904,  1.        ]])
因此,您可以消除for循环并将其全部替换为:
results2 = 1 - sp.distance.cdist(matrix1, matrix2, 'cosine')

有没有更快的方法?我有两组向量,想要计算这两组向量的余弦相似度。 - seralouk
1
由于余弦函数可以在范围[-1, 1]内取值,所以当余弦相似度为负数时,这种方法提供的值是不正确的。 - Celso França

3
您可以查看scikit-learn的API来计算余弦相似度:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.cosine_similarity.html。余弦相似度(Cosine similarity)又称为余弦核(Cosine kernel),用于计算X和Y的归一化点积相似度:K(X, Y) = <X, Y> / (||X||*||Y||)。其中,X:darray或稀疏数组,形状为(n_samples_X,n_features);Y:darray或稀疏数组,形状为(n_samples_Y,n_features)。如果为None,则输出将是X中所有样本间的成对相似度。

-1
如果A和B是numpy ndarrays,则以下内容应该给您提供一个以行为单位的余弦相似度,也作为一个numpy数组。
def cos(A, B): 
    return (A*B).sum(axis=1) / (A*A).sum(axis=1) ** .5 / (B*B).sum(axis=1) ** .5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接