Numpy高效矩阵自乘(gram矩阵)
Numpy efficient matrix self-multiplication (gram matrix)
我想在 numpy 中乘以 B = A @ A.T
。显然,答案将是一个对称矩阵(即 B[i, j] == B[j, i]
)。
但是,我不清楚如何利用它轻松地将计算时间缩短一半(通过只计算 B
的下三角,然后使用它免费获得上三角).
有没有办法以最佳方式执行此操作?
您可以随时使用 sklearns's pairwise_distances
用法:
from sklearn.metrics.pairwise import pairwise_distances
gram = pairwise_distance(x, metric=metric)
其中 metric
是一个可调用对象或定义其实施指标之一的字符串(上面 link 中的完整列表)
但是,我不久前为自己写了这篇文章,所以我可以分享我所做的事情:
import numpy as np
def computeGram(elements, dist):
n = len(elements)
gram = np.zeros([n, n])
for i in range(n):
for j in range(i + 1):
gram[i, j] = dist(elements[i], elements[j])
upTriIdxs = np.triu_indices(n)
gram[upTriIdxs] = gram.T[upTriIdxs]
return gram
其中 dist
是可调用的,在您的情况下 np.inner
如@PaulPanzer 的 link 所述,dot
可以检测到这种情况。这是时间证明:
In [355]: A = np.random.rand(1000,1000)
In [356]: timeit A.dot(A.T)
57.4 ms ± 960 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [357]: B = A.T.copy()
In [358]: timeit A.dot(B)
98.6 ms ± 805 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
我想在 numpy 中乘以 B = A @ A.T
。显然,答案将是一个对称矩阵(即 B[i, j] == B[j, i]
)。
但是,我不清楚如何利用它轻松地将计算时间缩短一半(通过只计算 B
的下三角,然后使用它免费获得上三角).
有没有办法以最佳方式执行此操作?
您可以随时使用 sklearns's pairwise_distances
用法:
from sklearn.metrics.pairwise import pairwise_distances
gram = pairwise_distance(x, metric=metric)
其中 metric
是一个可调用对象或定义其实施指标之一的字符串(上面 link 中的完整列表)
但是,我不久前为自己写了这篇文章,所以我可以分享我所做的事情:
import numpy as np
def computeGram(elements, dist):
n = len(elements)
gram = np.zeros([n, n])
for i in range(n):
for j in range(i + 1):
gram[i, j] = dist(elements[i], elements[j])
upTriIdxs = np.triu_indices(n)
gram[upTriIdxs] = gram.T[upTriIdxs]
return gram
其中 dist
是可调用的,在您的情况下 np.inner
如@PaulPanzer 的 link 所述,dot
可以检测到这种情况。这是时间证明:
In [355]: A = np.random.rand(1000,1000)
In [356]: timeit A.dot(A.T)
57.4 ms ± 960 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [357]: B = A.T.copy()
In [358]: timeit A.dot(B)
98.6 ms ± 805 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)