每行是一个向量,计算之后对角线为1,其余为与其他向量的相似度:
def csr_cosine_similarity(input_csr_matrix):
similarity = input_csr_matrix * input_csr_matrix.T
square_mag = similarity.diagonal()
inv_square_mag = 1 / square_mag
inv_square_mag[np.isinf(inv_square_mag)] = 0
inv_mag = np.sqrt(inv_square_mag)
return similarity.multiply(inv_mag).T.multiply(inv_mag)
例子:
test = np.random.random_integers(0,1,(3,3))
test
array([[1, 1, 0],
[0, 0, 1],
[0, 1, 0]])
test = sp.csc_matrix(test)
similarity = test * test.T
similarity.todense()
matrix([[2, 0, 1],
[0, 1, 0],
[1, 0, 1]], dtype=int32)
np.sqrt(1 / similarity.diagonal())
array([0.70710678, 1. , 1. ])
similarity.multiply(np.sqrt(1 / similarity.diagonal())).todense()
matrix([[1.41421356, 0. , 1. ],
[0. , 1. , 0. ],
[0.70710678, 0. , 1. ]])
稀疏矩阵的multiply
方法乘以向量,等价于每行点乘这个向量。
乘以矩阵,等价于点乘。
使用dot
方法乘以矩阵才是矩阵乘法。