Вычисление косинуса. Сходство в R дает разные результаты по сравнению с ручным? - PullRequest
0 голосов
/ 26 ноября 2018

Вот мои векторы:

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

Если я будусделай это сам в соответствии с Википедией :

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 голосов
/ 26 ноября 2018

В пакете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...