8

我有 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

4 回答 4

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函数 inlsa可能更容易/更有效地实现为as.dist(crossprod(x))......

编辑:在下面对现在已删除的答案的评论中,我建议如果想要在 [0,1] 上进行相似性测量,余弦距离测量的平方可能是合适的——这类似于使用确定系数(r^2) 而不是相关系数 (r) - 但也可能值得回过头来更仔细地考虑要使用的相似性度量的目的/含义......

于 2011-07-06T13:36:35.090 回答
2

函数cosine返回

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

在这种情况下,分母中的两项均为 1,但crossprod(a, b)为 -0.05。

于 2011-07-06T13:46:43.300 回答
1

余弦函数可以取负值。

于 2011-07-06T13:31:48.077 回答
0

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

于 2017-01-13T13:27:45.930 回答