我怀疑可能有这么一个帖子回答了这个问题,但我还没有找到,所以如果这是一个重复的问题,我提前道歉。在
为了我自己的学习目的,我尝试使用Numpy从头开始实现一个径向基函数内核。对于一维输入,计算非常简单:
def kernel(x, y):
return * np.exp( -0.5 * np.subtract.outer(x, y)**2)
以上是来自blog post on Gaussian Processes。在
但我想把它扩展到多个维度。我有一个可以正常工作的实现,如下所示:
^{pr2}$我正在使用sklearn.pairwise.rbf_kernel
检查
from sklearn.metrics.pairwise import rbf_kernel
print(rbf_kernel(x, gamma= .5))
[[1.00000000e+00 3.72665317e-06 1.69189792e-10 1.00000000e+00]
[3.72665317e-06 1.00000000e+00 2.11513104e-19 3.72665317e-06]
[1.69189792e-10 2.11513104e-19 1.00000000e+00 1.69189792e-10]
[1.00000000e+00 3.72665317e-06 1.69189792e-10 1.00000000e+00]]
但是很明显,double for循环并不是最有效的迭代方式。将此操作矢量化的最佳方法是什么?在
这个SO post提供了一种计算距离的有效方法,但没有提供我需要的矢量化。在
我们可以使用SciPy's ^{} ,然后用指数值来缩放-
我们也可以leverage ^{} -
^{pr2}$要在}作为预处理步骤:
2D
和1D
两种情况下使用这些方法,请将x
重塑为{X = x.reshape(len(x),-1)
,然后使用X
作为这些解决方案的输入。在您可以利用以下观察结果来解决问题:
||a - b|| ** 2 = ||a|| ** 2 + ||b|| ** 2 - 2 * <a, b>
在代码中,它将如下所示:
相关问题 更多 >
编程相关推荐