我有一个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规范方面,它不会成为一个问题。知道如何在没有功能的情况下实现这个吗?
答案 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, :]