【发布时间】:2021-09-24 14:44:16
【问题描述】:
我正在尝试生成一个类似于 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 矩阵? 还有什么其他方法可以解决这个问题? 任何见解将不胜感激。
【问题讨论】:
-
你确定你说的不是
(1+(a*b).sum()).pow(2)吗? -
@bobcat 是的。你说的对。刚刚编辑了问题!