np.vectorize
确实提高了速度 - 大约 2 倍(这里我使用math.atan2
作为一个带有 2 个标量参数的黑盒函数)。
In [486]: X=np.linspace(0,1,100)
In [487]: K_vect=np.vectorize(math.atan2)
In [488]: timeit proxy_kernel(X,X,math.atan2)
100 loops, best of 3: 7.84 ms per loop
In [489]: timeit K_vect(X[:,None],X)
100 loops, best of 3: 3.49 ms per loop
In [502]: timeit np.arctan2(X[:,None],X) # numpy compiled loop
1000 loops, best of 3: 871 µs per loop
where
def proxy_kernel(X,Y,K):
gram_matrix = np.zeros((X.shape[0], Y.shape[0]))
for i, x in enumerate(X):
for j, y in enumerate(Y):
gram_matrix[i, j] = K(x, y)
return gram_matrix
只要K
是一个黑匣子,您受到调用时间的限制K
the X.shape[0]*Y.shape[0]
次。您可以尝试最小化迭代时间,但您仍然受到所有这些函数调用的限制。
https://stackoverflow.com/a/29733040/901925 https://stackoverflow.com/a/29733040/901925通过利用高斯核加速计算axis
的参数np.linalg.norm
功能。