PyTorch 使用不带 For 循环的核函数生成矩阵

PyTorch Generating Matrix using a Kernel Function without For-Loops

我正在尝试生成类似于 Gram 矩阵的矩阵(PyTorch 上的张量对象),除了我需要在我的输入矩阵上应用核函数而不是内积。

For 循环如下所示有效:

N = x.shape[0] # x.shape = (N,d)
G = torch.zeros((N,N)) 
for i in range(N):
    for j in range(N):
        G[i][j] = K(x[i], x[j])

其中 x 是我的输入张量,其形状为 (N,d),核函数 K(a,b) 在执行一些数学运算后产生一个实数值。例如:

def K(a,b):
   return ((1+(a*b)).sum()).pow(2) #second degree polynomial.

我想生成这个矩阵 G,而不必更改核函数 K(),当然也不需要 for 循环!

我最初的尝试是使用 lambda 方法,但下面的这段代码显然不起作用,因为它只产生 k(x[i],x[i]) 的列表。

G = torch.tensor(list(map(lambda a,b: K(a,b),x,x))

如何使用 lambda 函数生成 N×N 矩阵? 还有什么其他方法可以解决这个问题? 任何见解将不胜感激。

您可以通过 x 简单地计算 G

G = (1 + torch.matmul(x, x.T)).pow(2)