矩阵v1:,可看作n个k维行向量
矩阵v2:,可看作m个k维列向量
计算v1的行向量和v2列向量的余弦相似度,无循环
根据余弦相似度公式,向量点乘除以模的乘积,拓展到矩阵间运算大致分为三步:
1. 矩阵点乘,得到矩阵m:
2. v1行方向求模得到m1:,v2列方向求模得到m2:,m1与m2点乘得到矩阵denom:
3. 矩阵m/demom,对应位置除运算
如此即可矩阵运算得到行列向量间的余弦相似度,python代码如下:
def matrix_cos_similar(v1, v2):
# v1.shape = (n,k), v2.shape = (m,k)
v2 = np.array(v2).T
#step1:矩阵点乘
dot_matrix = np.dot(v1, v2)
#step2:v1行方向求模,v2列方向求模,结果点乘
v1_row_norm = np.linalg.norm(v1, axis=1).reshape(-1,1)
v2_col_norm = np.linalg.norm(v2,axis=0).reshape(1,-1)
# print(v1_row_norm.shape)
norm_matrix = np.dot(v1_row_norm, v2_col_norm)
#step3:对应位置做除法运算,相当于向量乘积/模的乘积
res = dot_matrix / norm_matrix
res[np.isneginf(res)] = 0
return res