Pytorch 中距离矩阵的通用计算
Generic Computation of Distance Matrices in Pytorch
我有两个张量 a
和 b
形状 (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)
表示x
和y
之间的归一化内积)
我有两个张量 a
和 b
形状 (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)
表示x
和y
之间的归一化内积)