计算两个相同形状矩阵的行之间的余弦相似度的最快方法是什么

What is the fastest way of calculate cosine similarity between rows of two same shape matrices

例如,我有两个二维数组如下:

X = array([[4, 4, 4, 2],
   [3, 1, 2, 2],
   [1, 3, 3, 3],
   [1, 3, 1, 2]])
Y = array([[2, 1, 1, 4],
   [2, 1, 1, 1],
   [4, 1, 4, 4],
   [4, 2, 3, 4]])

我想计算X行和Y行之间的余弦相似度,比如

def cos(feats1, feats2):
    """
    Computing cosine distance
    For similarity
    """
    cos = np.dot(feats1, feats2) / (np.linalg.norm(feats1) * np.linalg.norm(feats2))
    return cos

for i in range(a.shape[0]):
    print(cos(a[i,:],b[i,:]))

现在,我正在使用for循环来计算向量之间的cos距离。但是X和Y的大小是(1200000000, 512),用for循环计算真的很费时间

我的问题是如何利用代数和 numpy 的力量来加速这个过程。

或可以更有效地执行此计算的任何其他方法。

谢谢

可能在一行中:诀窍是仅指定执行范数和点积的轴。

X = np.random.randn(3,2)
Y = np.random.randn(3,2)
(X * Y).sum(axis=1) / np.linalg.norm(X, axis=1) / np.linalg.norm(Y, axis=1)

第一部分,(X * Y).sum(axis=1)负责计算点积。 axis=1 指定我们对列执行点积,即获取每一行(数据点)的结果。

第二部分只是计算每个向量的范数,方法相同。

如果只想使用numpy,请善用广播:

>>> def cos(x, y):
...     return (x * y).sum(axis=1) / (np.linalg.norm(x, axis=1) * np.linalg.norm(y, axis=1))
...
>>> X = np.array([[4, 4, 4, 2],
...    [3, 1, 2, 2],
...    [1, 3, 3, 3],
...    [1, 3, 1, 2]])
>>> Y = np.array([[2, 1, 1, 4],
...    [2, 1, 1, 1],
...    [4, 1, 4, 4],
...    [4, 2, 3, 4]])
>>> cos(X, Y)
array([0.70957488, 0.97995789, 0.83692133, 0.80829038])