У меня есть две формулы для вычисления «косинусного сходства», в чем разница? - PullRequest
0 голосов
/ 14 июня 2019

Я делаю проект о сходстве косинусов в наборе данных фильма, я запутался в формуле вычисления сходства косинусов.

enter image description here

Но я искал в Интернете, некоторые статьи показывают, что знаменатель что-то вроде: sqrt (A1 ^ 2 + B1 ^ 2) * sqrt (A2 ^ 2 + B2 ^ 2) * ... * sqrt (Ai ^ 2 + Bi ^ 2)

Я в замешательстве, какая разница? Какой из них правильный или они оба правильные?

1 Ответ

1 голос
/ 15 июня 2019

На вашем изображении правильно. В двух измерениях он получен из закона косинусов который связывает длину одной стороны треугольника с длиной двух других сторон, а угол, противоположный c, тета:

c^2==a^2+b^2-2*b*c(cos(theta))

Вы можете доказать это многими способами, и хорошая проверка состоит в том, чтобы знать, что когда cos(gamma)==0 (стороны a и b ортогональны), вы получаете теорему Пифагора. Чтобы получить формулу на изображении, вы должны перевести ее в аналитическую геометрию (векторы)

norm(A-B)^2==norm(A)^2+norm(B)^2−2*norm(A)*norm(B)*cos(theta)

и с использованием этой нормы (A-B) ^ 2 по определению (A-B) * (A-B) и расширяется мы получаем

norm(A-B)^2 ==norm(A)^2+norm(B)^2-2*A*B

Таким образом, приравнивая оба выражения и делая отмены, получим

norm(A)*norm(B)*cos(theta) = A*B

которая (переставленная) формула в вашем определении (и norm(v) = sqrt(v*v)). Для n измерений вы можете показать, что это работает, потому что вращение евклидова пространства сохраняет норму и внутреннее произведение, и потому что 2D-плоскость, охватываемая векторами, является в точности вращением плоскости xy.

Хорошей проверкой работоспособности является то, что ортогональность дает косинус 0 и что косинус находится между 0 и 1 (это - теорема Коши Шварца )

Обновление: В примерах, упомянутых в вашем комментарии, вы можете увидеть результаты из блога, запустив

import sklearn.metrics.pairwise as pw
print(pw.cosine_similarity([[4,3]],[[5,5]]))
print(pw.cosine_similarity([[4,3,5]],[[5,5,1]]))

обратите внимание, что если вы запустите:

from sklearn.metrics.pairwise import pairwise_distances
print(pairwise_distances([[4,3,5]],[[5,5,1]],metric='cosine')) 

Вы получаете 0,208 вместо 0,792, это потому, что pairwise_distance использует метрика косинуса задается как 1-cos(theta) (см. что 0.208 + 0.792 равно 1). Вы делаете это преобразование, потому что, когда вы говорите о расстояниях, вы хотите, чтобы расстояние от точки до себя было равно 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...