计算python矩阵的列的余弦相似度

时间:2016-06-20 18:04:31

标签: python numpy matrix

我有一个numpy矩阵说A如下

array([[1, 2, 3],
       [1, 2, 2]])

我想找到这个矩阵的余弦相似度矩阵,其中余弦相似度在列之间。

现在两个向量的余弦相似度只是两个点范数乘以每个L2范数乘积的

但我不想在循环中迭代每一列并执行它。

所以我第一次尝试了这个:

from scipy.spatial import distance 
cos=distance.cdist(a.T,a.T,'cosine')

这里我正在进行转置,否则就会进行行余弦(观察)。我想要列。

但我不确定这是正确的答案。该函数的文档说它给出了1- cosine_similarity。我应该这样做吗?

cos-1-distance.cdist(a.T,a.T,'cosine') 

请指教。

II)

同样如果我尝试做这样的事情:

cos=(np.dot(a.T,a))/(np.linalg.norm(a, axis=0, keepdims=True))*(np.linalg.norm(a, axis=0, keepdims=True))

在获得正确列的正确L2规范方面,它不会成为一个问题。知道如何在没有功能的情况下实现这个吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

a = np.array([[1, 2, 3], [1, 2, 2]])
n = np.linalg.norm(a, axis=0).reshape(1, a.shape[1])
a.T.dot(a) / n.T.dot(n)

array([[ 1.        ,  1.        ,  0.98058068],
       [ 1.        ,  1.        ,  0.98058068],
       [ 0.98058068,  0.98058068,  1.        ]])

n的这项任务也有效。

np.linalg.norm(a, axis=0)[None, :]