为什么两个向量之间的余弦相似性是负的?

时间:2011-07-06 13:16:16

标签: r similarity negative-number cosine

我有2个11维的载体。

a <- c(-0.012813841, -0.024518383, -0.002765056,  0.079496744,  0.063928973,
        0.476156960,  0.122111977,  0.322930189,  0.400701256,  0.454048860,
        0.525526219)

b <- c(0.64175768,  0.54625694,  0.40728261,  0.24819750,  0.09406221, 
       0.16681692, -0.04211932, -0.07130129, -0.08182200, -0.08266852,
       -0.07215885)

cosine_sim <- cosine(a,b)

返回:

-0.05397935

我使用cosine()包中的lsa

对于某些值,我得到的负cosine_sim就像给定的一样。我不确定相似性如何是负面的。它应该在0和1之间。

任何人都可以解释这里发生了什么。

4 个答案:

答案 0 :(得分:14)

关于R的好处是你可以经常深入研究各种功能,亲眼看看发生了什么。如果键入cosine(没有任何括号,参数等),则R打印出函数体。通过它(需要一些练习),您可以看到有一堆机器用于计算矩阵列的成对相似性(即,if (is.matrix(x) && is.null(y))条件包裹的位,但关键线功能是

crossprod(x, y)/sqrt(crossprod(x) * crossprod(y))

让我们把它拉出来并应用到你的例子中:

> crossprod(a,b)/sqrt(crossprod(a)*crossprod(b))
            [,1]
[1,] -0.05397935
> crossprod(a)
     [,1]
[1,]    1
> crossprod(b)
     [,1]
[1,]    1

所以,你正在使用已经规范化的向量,所以你只需要crossprod来查看。在你的情况下,这相当于

> sum(a*b)
[1] -0.05397935

(对于实矩阵运算,crossprod比手工构造等效运算更有效。

正如@Jack Maney的回答所说,两个向量的点积(长度(a)*长度(b)* cos(a,b))可以是负数...

对于它的价值,我怀疑cosine中的lsa函数可能更容易/有效地为矩阵参数实现as.dist(crossprod(x)) ...

编辑:在对下面现在删除的答案的评论中,我建议如果想要一个相似性度量的话,余弦距离度量的 square 可能是合适的[0,1] - 这类似于使用决定系数(r ^ 2)而不是相关系数(r) - 但它也可能值得回过头来仔细思考目的/意义要使用的相似性措施...

答案 1 :(得分:2)

cosine函数返回

crossprod(a, b)/sqrt(crossprod(a) * crossprod(b))

在这种情况下,分母中的两个术语都是1,但crossprod(a, b)是-0.05。

答案 2 :(得分:1)

cosine function可以采用负值。

答案 3 :(得分:0)

虽然两个向量的余弦可以取-1和+1之间的任何值,但余弦相似度(在dicument retreival中)用于从[0,1]区间取值。原因很简单:在WordxDocument矩阵中没有负值,因此两个向量的最大角度为90度,余弦为0。