Pytorch 中距离矩阵的通用计算

Generic Computation of Distance Matrices in Pytorch

我有两个张量 ab 形状 (m,n),我想使用一些距离度量 d 计算距离矩阵 m ].也就是我要m[i][j] = d(a[i], b[j])。这有点像 cdist(a,b) 但假设通用距离函数 d 不一定是 p 范数距离。在 PyTorch 中是否有通用的方法来实现它?

还有一个更具体的附带问题:是否有一种有效的方法可以使用以下指标来执行此操作

d(x,y) = 1 - cos(x,y)

编辑

我已经使用 答案解决了上述特定案例:

def metric(a, b, eps=1e-8):
    a_norm, b_norm = a.norm(dim=1)[:, None], b.norm(dim=1)[:, None]
    a_norm = a / torch.max(a_norm, eps * torch.ones_like(a_norm))
    b_norm = b / torch.max(b_norm, eps * torch.ones_like(b_norm))
    similarity_matrix = torch.mm(a_norm, b_norm.transpose(0, 1))
    return 1 - similarity_matrix

我建议使用广播:因为 a,b 都有形状 (m,n) 你可以计算

m = d( a[None, :, :], b[:, None, :])

其中d需要对最后一个维度进行操作,例如

def d(a,b): return 1 - (a * b).sum(dim=2) / a.pow(2).sum(dim=2).sqrt() / b.pow(2).sum(dim=2).sqrt()

(这里我假设cos(x,y)表示xy之间的归一化内积)