Почему косинусное сходство между двумя векторами может быть отрицательным? - PullRequest
7 голосов
/ 06 июля 2011

У меня есть 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.

Может кто-нибудь объяснить, что здесь происходит.

Ответы [ 4 ]

14 голосов
/ 06 июля 2011

Приятной особенностью 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 гораздо эффективнее, чем создание эквивалентной операции вручную).

As @В ответе Джека Мани говорится, что скалярное произведение двух векторов (это длина (a) * длина (b) * cos (a, b)) может быть отрицательным ...

Для чего это стоит, я подозреваючто функция cosine в lsa может быть более легко / эффективно реализована для аргументов матрицы как as.dist(crossprod(x)) ...

edit : в комментариях к удаленному ответу нижеЯ предположил, что квадрат гоМера косинус-расстояния может быть подходящей, если кто-то хочет меру подобия на [0,1] - это было бы аналогично использованию коэффициента детерминации (r ^ 2), а не коэффициента корреляции (r) - но этоможет также стоить вернуться и более тщательно обдумать назначение / значение мер сходства, которые будут использоваться ...

2 голосов
/ 06 июля 2011

Функция cosine возвращает

crossprod(a, b)/sqrt(crossprod(a) * crossprod(b))

В этом случае оба термина в знаменателе равны 1, но crossprod(a, b) равно -0,05.

1 голос
/ 06 июля 2011

Функция косинуса может принимать отрицательные значения.

0 голосов
/ 13 января 2017

Хотя косинус двух векторов может принимать любое значение в диапазоне от -1 до +1, косинус сходство (при повторном пробуждении) используется для получения значений из интервала [0,1]. Причина проста: в матрице WordxDocument нет отрицательных значений, поэтому максимальный угол двух векторов равен 90 градусам, для которых косинус равен 0.

...