我有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之间。
任何人都可以解释这里发生了什么。
答案 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。