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