与手工计算相比,R中的余弦相似度计算得出不同的结果?

时间:2018-11-26 15:42:16

标签: r cosine-similarity

这是我的载体:

lin_acc_mag_mean vel_ang_unc_mag_mean
             <dbl>                <dbl>
1            0.688                0.317


  lin_acc_mag_mean vel_ang_unc_mag_mean
             <dbl>                <dbl>
1             2.94                0.324

或为简单起见:

a <- c(.688,.317) 
b <- c(2.94, .324)

我要计算tcR::cosine.similarity

cosine.similarity(a,b, .do.norm = T) gives me 1.388816

如果我愿意根据Wikipedia自己这样做:

sum(c(.688,.317) * c(2.94, .324)) / (sqrt(sum(c(.688,.317) ^ 2)) * sqrt(sum(c(2.94, .324) ^ 2))) 

我得到0.948604,所以这里有什么不同? 请指教。我想这是标准化,但会很高兴您的帮助。

1 个答案:

答案 0 :(得分:1)

tcR包中,cosine.similarity函数包含以下内容:

function (.alpha, .beta, .do.norm = NA, .laplace = 0) 
{
    .alpha <- check.distribution(.alpha, .do.norm, .laplace)
    .beta <- check.distribution(.beta, .do.norm, .laplace)
    sum(.alpha * .beta)/(sum(.alpha^2) * sum(.beta^2))
}

中间的check.distribution计算返回一个向量,该向量的总和为1,但似乎未进行归一化。

我建议改为使用cosine包中的lsa函数。这个产生正确的值。它还允许计算按列组织的向量的整个矩阵的余弦相似度。例如,cosine(cbind(a,b,b,a))产生以下结果:

         a        b        b        a
a 1.000000 0.948604 0.948604 1.000000
b 0.948604 1.000000 1.000000 0.948604
b 0.948604 1.000000 1.000000 0.948604
a 1.000000 0.948604 0.948604 1.000000