向量化径向基函数多维特征的欧氏距离计算

2024-05-16 09:28:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我怀疑可能有这么一个帖子回答了这个问题,但我还没有找到,所以如果这是一个重复的问题,我提前道歉。在

为了我自己的学习目的,我尝试使用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提供了一种计算距离的有效方法,但没有提供我需要的矢量化。在


Tags: 方法函数目的numpydefnpsklearnpost
2条回答

我们可以使用SciPy's ^{},然后用指数值来缩放-

from scipy.spatial.distance import cdist

lam = -.5
out = np.exp(lam* cdist(x,x,'sqeuclidean'))

我们也可以leverage ^{}-

^{pr2}$

要在2D1D两种情况下使用这些方法,请将x重塑为{}作为预处理步骤:X = x.reshape(len(x),-1),然后使用X作为这些解决方案的输入。在

您可以利用以下观察结果来解决问题:

||a - b|| ** 2 = ||a|| ** 2 + ||b|| ** 2 - 2 * <a, b>

在代码中,它将如下所示:

x_norm = np.linalg.norm(x, axis=1) ** 2
output = np.exp(- 0.5 * (x_norm.reshape(-1, 1) + x_norm.reshape(1, -1) - 2 * np.dot(x, x.T)))

相关问题 更多 >