Статья Cosine Similarity в Википедии
Можете ли вы показать векторы здесь (в виде списка или еще чего-нибудь), а затем выполнить математику, и давайте посмотрим, как это работает?
Я новичок
Статья Cosine Similarity в Википедии
Можете ли вы показать векторы здесь (в виде списка или еще чего-нибудь), а затем выполнить математику, и давайте посмотрим, как это работает?
Я новичок
Ответы:
Вот два очень коротких текста для сравнения:
Julie loves me more than Linda loves me
Jane likes me more than Julie loves me
Мы хотим знать, насколько похожи эти тексты, чисто с точки зрения количества слов (и игнорируя порядок слов). Начнем с составления списка слов из обоих текстов:
Теперь посчитаем, сколько раз каждое из этих слов встречается в каждом тексте:
Мы не заинтересованы в самих словах, хотя. Нас интересуют только эти два вертикальных вектора отсчетов. Например, в каждом тексте есть два экземпляра «я». Мы собираемся решить, насколько близки эти два текста друг к другу, вычислив одну функцию этих двух векторов, а именно косинус угла между ними.
Два вектора, опять же:
Косинус угла между ними составляет около 0,822.
Эти векторы 8-мерны. Преимущество использования косинусного сходства состоит в том, что он превращает вопрос, который выше человеческой способности визуализировать, в тот, который может быть. В этом случае вы можете думать об этом как о углу около 35 градусов, что является некоторым «расстоянием» от нуля или идеальным соглашением.
источник
Я предполагаю, что вы больше заинтересованы в том, чтобы получить представление о том, « почему » работает косинусное сходство (почему оно дает хорошее представление о сходстве), а не о « как » его вычислять (конкретные операции, используемые для расчета). Если вас интересует последнее, см. Ссылку, указанную Даниэлем в этом посте, а также соответствующий вопрос SO .
Чтобы объяснить как и даже более того, почему, полезно, во-первых, упростить проблему и работать только в двух измерениях. Как только вы получите это в 2D, вам будет легче думать об этом в трех измерениях, и, конечно, сложнее представить это во многих других измерениях, но к тому времени мы сможем использовать линейную алгебру для выполнения численных расчетов, а также, чтобы помочь нам мыслить в терминах линий / векторов / "плоскостей" / "сфер" в n измерениях, хотя мы не можем их нарисовать.
Таким образом, в двух измерениях : в отношении сходства текста это означает, что мы сосредоточимся на двух разных терминах, скажем, слова «Лондон» и «Париж», и посчитаем, сколько раз каждое из этих слов встречается в каждом из два документа, которые мы хотим сравнить. Это дает нам для каждого документа точку в плоскости xy. Например, если у Doc1 был Париж один раз, а Лондон - четыре, точка (1,4) представила бы этот документ (в отношении этой крошечной оценки документов). Или, говоря с точки зрения векторов, этот документ Doc1 будет стрелкой, идущей от начала координат к точке (1,4). Имея это в виду, давайте подумаем о том, что означает, что два документа должны быть похожими, и как это относится к векторам.
ОЧЕНЬ похожие документы (опять же в отношении этого ограниченного набора измерений) будут иметь такое же количество ссылок на Париж, И то же самое число ссылок на Лондон, или, может быть, они могут иметь одинаковое соотношение этих ссылок. Документ, Doc2, с 2 ссылками на Париж и 8 ссылками на Лондон, также будет очень похож, только с, возможно, более длинным текстом или как-то более повторяющимся из названий городов, но в той же пропорции. Может быть, оба документа являются путеводителями по Лондону, в которых содержатся только мимолетные ссылки на Париж (и как не круто этот город ;-) Шучу !!!
Теперь менее похожие документы могут также включать ссылки на оба города, но в разных пропорциях. Может быть, Doc2 будет ссылаться только на Париж один раз, а Лондон - семь раз.
Возвращаясь к нашей плоскости xy, если мы нарисуем эти гипотетические документы, мы увидим, что когда они ОЧЕНЬ похожи, их векторы перекрываются (хотя некоторые векторы могут быть длиннее), и, поскольку они начинают иметь меньше общего, эти векторы начинают расходиться, иметь более широкий угол между ними.
Измеряя угол между векторами, мы можем получить хорошее представление об их сходстве , и, чтобы сделать вещи еще проще, взяв косинус этого угла, мы получим хорошее значение от 0 до 1 или от -1 до 1, которое указывает на это сходство, в зависимости от того, что и как мы учитываем. Чем меньше угол, тем больше (ближе к 1) значение косинуса, а также выше сходство.
В крайнем случае, если Doc1 только ссылается на Париж, а Doc2 только ссылается на Лондон, документы не имеют абсолютно ничего общего. Doc1 будет иметь свой вектор на оси x, Doc2 на оси y, угол 90 градусов, косинус 0. В этом случае мы бы сказали, что эти документы ортогональны друг другу.
Добавление измерений .
Благодаря этому интуитивному ощущению сходства, выраженному в виде небольшого угла (или большого косинуса), мы можем теперь представить вещи в трех измерениях, скажем, введя слово «Амстердам» в микс, и довольно хорошо визуализировать, как документ с двумя ссылки на каждую из них будут иметь вектор, идущий в определенном направлении, и мы можем видеть, как это направление будет сравниваться с документом, в котором три раза упоминаются Париж и Лондон, но не Амстердам и т. д. Как уже говорилось, мы можем попытаться представить себе эту причудливую картину. место для 10 или 100 городов. Это трудно рисовать, но легко осмыслить.
В заключение я скажу несколько слов о самой формуле . Как я уже сказал, другие ссылки дают хорошую информацию о расчетах.
Сначала в двух измерениях. Формула для косинуса угла между двумя векторами получается из тригонометрической разности (между углом a и углом b):
Эта формула выглядит очень похоже на формулу точечного произведения:
где
cos(a)
соответствуетx
значению иsin(a)
поy
значению, для первого вектора и т.д. Единственная проблема, в том , чтоx
,y
и т.д., не в точностиcos
иsin
значение, поскольку эти значения должны быть считаны на единичной окружности. Вот где знаменатель формулы ударов в: путем деления на произведение длины этих векторов, тоx
иy
координаты нормализуются.источник
Вот моя реализация в C #.
источник
Для простоты я сокращаю вектор a и b:
Тогда косинус сходства (тета):
тогда обратное значение cos 0.5 равно 60 градусам.
источник
Этот код Python является моей быстрой и грязной попыткой реализовать алгоритм:
источник
Используя пример @Bill Bell, два способа сделать это в [R]
или воспользовавшись производительностью метода crossprod () ...
источник
Это простой
Python
код, который реализует косинусное сходство.источник
источник
Простой код JAVA для расчета косинусного сходства
источник
Два вектора A и B существуют в 2D-пространстве или 3D-пространстве, угол между этими векторами равен cos подобию.
Если угол больше (может достигать макс. 180 градусов), то есть Cos 180 = -1, а минимальный угол составляет 0 градусов. cos 0 = 1 подразумевает, что векторы выровнены друг с другом и, следовательно, векторы похожи.
cos 90 = 0 (этого достаточно, чтобы сделать вывод, что векторы A и B совсем не похожи, и поскольку расстояние не может быть отрицательным, значения косинуса будут лежать в диапазоне от 0 до 1. Следовательно, больший угол подразумевает уменьшение сходства (визуализация также его имеет смысл)
источник