Python 矢量化径向基函数&x27;多维特征的欧氏距离计算

Python 矢量化径向基函数&x27;多维特征的欧氏距离计算,python,numpy,scikit-learn,linear-algebra,Python,Numpy,Scikit Learn,Linear Algebra,我怀疑可能有一个SO帖子已经回答了这个问题,但我还没有找到它,所以如果这是一个重复的问题,我提前道歉 为了我自己的学习目的,我正在尝试使用Numpy从头开始实现一个径向基函数内核。对于一维输入,计算非常简单: def kernel(x, y): return * np.exp( -0.5 * np.subtract.outer(x, y)**2) 以上是一个例子 但我试图将其扩展到多个维度。我有一个在下面运行良好的实现: x = np.array([[4,3,5], [1,3,9],

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

为了我自己的学习目的,我正在尝试使用Numpy从头开始实现一个径向基函数内核。对于一维输入,计算非常简单:

def kernel(x, y):
    return * np.exp( -0.5 * np.subtract.outer(x, y)**2)
以上是一个例子

但我试图将其扩展到多个维度。我有一个在下面运行良好的实现:

x = np.array([[4,3,5], [1,3,9], [0,1,0], [4,3,5]])
distances = []
γ = -.5
for i in x:
    for j in x:
        distances.append(np.exp(γ * np.linalg.norm(i - j) ** 2))
np.array(distances).reshape(len(x),len(x))

[[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]]
我正在使用
sklearn.pairwise.rbf\u内核进行检查

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]]
但很明显,双for循环并不是迭代此过程的最有效方式。将此操作矢量化的最佳方法是什么

这提供了一种计算距离的有效方法,但没有提供我需要的矢量化。

我们可以使用这些方法,然后用指数值缩放它们-

from scipy.spatial.distance import cdist

lam = -.5
out = np.exp(lam* cdist(x,x,'sqeuclidean'))
我们也可以-

要在
2D
1D
情况下使用这些方法,将
x
重塑为
2D
作为预处理步骤:
x=x。重塑(len(x),-1)
,然后使用
x
作为这些解决方案的输入。我们可以使用它们,然后用指数值进行缩放-

from scipy.spatial.distance import cdist

lam = -.5
out = np.exp(lam* cdist(x,x,'sqeuclidean'))
我们也可以-


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

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

|a-b | | |**2=| | a | |**2+| | b |**2-2*

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

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)))

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

|a-b | | |**2=| | a | |**2+| | b |**2-2*

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

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)))