这是我的载体:
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
,所以这里有什么不同?
请指教。我想这是标准化,但会很高兴您的帮助。
答案 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