解释负余弦相似度

机器算法验证 机器学习 word2vec 余弦相似度
2022-02-09 02:41:54

我的问题可能很愚蠢。所以我要提前道歉。

我试图使用斯坦福 NLP 小组(链接)预训练的 GLOVE 模型但是,我注意到我的相似性结果显示了一些负数。

这立即促使我查看词向量数据文件。显然,词向量中的值被允许为负数。这解释了为什么我看到负余弦相似性。

我习惯了频率向量的余弦相似度的概念,其值在 [0, 1] 内。我知道点积和余弦函数可以是正数或负数,具体取决于向量之间的角度。但我真的很难理解和解释这种负余弦相似度。

例如,如果我有一对相似度为 -0.1 的词,它们的相似度是否低于相似度为 0.05 的另一对词?比较 -0.9 和 0.8 的相似度怎么样?

或者我应该只看最小角度差的绝对值nπ? 分数的绝对值?

非常感谢。

4个回答

让两个向量ab,角度由标量积和向量的范数获得:θ

cos(θ)=ab||a||||b||

由于值在范围内:cos(θ)[1,1]

  • 1值表示强烈相反的向量
  • 0个独立(正交)向量
  • 1相似(正共线)向量。中间值用于评估相似程度。

示例:让两个用户,以及这两个用户之间的相似度根据他们对电影的喜好:U1U2sim(U1,U2)

  • sim(U1,U2)=1如果两个用户的口味完全相同(或者如果 U1=U2
  • sim(U1,U2)=0如果我们没有找到两个用户之间的任何相关性,例如如果他们没有看过任何常见的电影
  • sim(U1,U2)=1如果用户有相反的口味,例如,如果他们以相反的方式评价相同的电影

不要使用绝对值,因为负号不是任意的。要获取 0 到 1 之间的余弦值,您应该使用以下余弦函数:

(R代码)

cos.sim <- function(a,b) 
{
  dot_product = sum(a*b)
  anorm = sqrt(sum((a)^2))
  bnorm = sqrt(sum((b)^2))
  minx =-1
  maxx = 1
  return(((dot_product/anorm*bnorm)-minx)/(maxx-minx))
} 

(Python代码)

def cos_sim(a, b):
    """Takes 2 vectors a, b and returns the cosine similarity according 
to the definition of the dot product"""
    dot_product = np.dot(a, b)
    norm_a = np.linalg.norm(a)
    norm_b = np.linalg.norm(b)
    return dot_product / (norm_a * norm_b)

minx = -1 
maxx = 1

cos_sim(row1, row2)- minx)/(maxx-minx)
```

余弦相似度就像皮尔逊相关,但没有减去均值。因此,您可以通过查看绝对值来比较 2 个余弦相似度的相对强度,就像比较 2 个 Pearson 相关性的绝对值一样。

频率向量之间的余弦相似度不能为负是正确的,因为字数不能为负,但是使用词嵌入(例如手套)可以有负值。

Word-embedding 构造的简化视图如下:将每个单词分配给 R^d 中的随机向量。接下来运行一个优化器,尝试将两个相似的向量 v1 和 v2 推得更近,或者将两个不同的向量 v3 和 v4 拉得更远(根据一定的距离,比如余弦)。您运行此优化以进行足够的迭代,最后,您拥有词嵌入,其唯一标准是相似词具有更接近的向量而不同的向量相距更远。最终结果可能会给您留下一些维度值是负数,而一些对具有负余弦相似性——仅仅是因为优化过程不关心这个标准。它可能已经将一些向量很好地推到了负值中。向量的维度与字数不对应,