计算两个相同形状矩阵的行之间的余弦相似度的最快方法是什么
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])
例如,我有两个二维数组如下:
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])