与手动相比,在 R 中计算 cosine.similarity 会给出不同的结果?

Computing cosine.similarity in R gives different results compared to manual?

这是我的向量:

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 那么这里有什么不同? 请指教。我想这是正常化,但很乐意为您提供帮助。

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 计算 returns 总和为 1 的向量,但似乎没有被归一化。

我建议改用 lsa 包中的 cosine 函数。这一个产生正确的值。它还允许计算按列组织的整个向量矩阵的余弦相似度。例如,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