代码之家  ›  专栏  ›  技术社区  ›  Amir Jalilifard

为什么完全相同的向量之间的火炬余弦相似性给出的相似性为零而不是一?

  •  0
  • Amir Jalilifard  · 技术社区  · 2 年前

    我有两个张量,我想在Pytorch中计算它们之间的余弦相似性:

    a = torch.tensor([[0.,0.,0.,0.,0.]])
    b = torch.tensor([[0.,0.,0.,0.,0.]])
    

    我使用以下函数计算余弦相似性矩阵:

    def calc_similarity_batch(a, b):
        representations = torch.cat([a, b], dim=0)
        return F.cosine_similarity(representations.unsqueeze(1), representations.unsqueeze(0), dim = 2)
    

    令我惊讶的是,余弦_相似性函数计算的相似性矩阵是:

    tensor([[0., 0.],
            [0., 0.]])
    

    虽然应该是:

    tensor([[1., 1.],
            [1., 1.]])
    

    因为矢量是相同的。有人能解释一下我的代码出了什么问题吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Klops    2 年前

    你是对的,任何相等向量之间的余弦相似度应该是一。。。除了长度为零的矢量之外。在这种情况下,您有一个除以零的结果是未定义的。您使用的实现似乎以0的相似性处理了这种情况。

    图片显示了公式,在那里你会看到分母为零。

    enter image description here

    如果零是处理这种“被禁止”的情况的好选择?我不知道。由于余弦相似性测量的是两个向量之间的角度(如果两个向量相等,则不是),-1和+1似乎也不好。使用0可能是信息量最小的折衷方案。此外,如果两个向量中的任意一个向量的长度为零,则考虑分母为零。在这种情况下,您的案例是一个特例。

    推荐文章