Кто-то может дать пример подобия косинуса очень простым, графическим способом?

СЕТЬ-INF является хорошим местом для помещения файла конфигурации. Вот некоторый код для получения полного пути каталога от сервлета.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
189
задан slaphappy 6 October 2015 в 01:08
поделиться

3 ответа

Вот два очень коротких текста для сравнения:

  1. Джули любит меня больше, чем Линда любит меня

  2. Джейн любит меня больше, чем Джули любит меня

Мы хотим знать, насколько похожи эти тексты, чисто с точки зрения количества слов (и игнорирования порядка слов). Мы начнем с составления списка слов из обоих текстов:

me Julie loves Linda than more likes Jane

Теперь посчитаем, сколько раз каждое из этих слов встречается в каждом тексте:

   me   2   2
 Jane   0   1
Julie   1   1
Linda   1   0
likes   0   1
loves   2   1
 more   1   1
 than   1   1

Но нас не интересуют сами слова. Нас интересует только эти два вертикальных вектора отсчетов. Например, есть два экземпляра «я» в каждом тексте. Мы собираемся решить, насколько близки эти два текста каждому другой, вычисляя одну функцию этих двух векторов, а именно косинус угол между ними.

Два вектора, опять же:

a: [2, 0, 1, 1, 0, 2, 1, 1]

b: [2, 1, 1, 0, 1, 1, 1, 1]

Косинус угла между ними составляет около 0,822.

Эти векторы 8-мерные. Преимущество использования косинусного подобия очевидно что он преобразует вопрос, который невозможно представить себе, в один это может быть. В данном случае это можно представить как угол около 35 °. градусов, что является некоторым «расстоянием» от нуля или полного совпадения.

439
ответ дан 23 November 2019 в 05:38
поделиться

Вот моя реализация на C #.

using System;

namespace CosineSimilarity
{
    class Program
    {
        static void Main()
        {
            int[] vecA = {1, 2, 3, 4, 5};
            int[] vecB = {6, 7, 7, 9, 10};

            var cosSimilarity = CalculateCosineSimilarity(vecA, vecB);

            Console.WriteLine(cosSimilarity);
            Console.Read();
        }

        private static double CalculateCosineSimilarity(int[] vecA, int[] vecB)
        {
            var dotProduct = DotProduct(vecA, vecB);
            var magnitudeOfA = Magnitude(vecA);
            var magnitudeOfB = Magnitude(vecB);

            return dotProduct/(magnitudeOfA*magnitudeOfB);
        }

        private static double DotProduct(int[] vecA, int[] vecB)
        {
            // I'm not validating inputs here for simplicity.            
            double dotProduct = 0;
            for (var i = 0; i < vecA.Length; i++)
            {
                dotProduct += (vecA[i] * vecB[i]);
            }

            return dotProduct;
        }

        // Magnitude of the vector is the square root of the dot product of the vector with itself.
        private static double Magnitude(int[] vector)
        {
            return Math.Sqrt(DotProduct(vector, vector));
        }
    }
}
23
ответ дан 23 November 2019 в 05:38
поделиться

Я предполагаю, что вас больше интересует ", почему " работает косинусное сходство (почему оно дает хорошее указание на сходство), а не " как "он вычисляется (конкретные операции, используемые для вычисления). Если вас интересует последнее, см. Ссылку, указанную Даниэлем в этом посте, а также связанный вопрос SO .

Чтобы объяснить как, а тем более почему, это полезно , во-первых, чтобы упростить задачу и работать только в двух измерениях. Как только вы получите это в 2D, вам будет легче думать об этом в трех измерениях и, конечно, сложнее представить себе во многих других измерениях, но к тому времени мы сможем использовать линейную алгебру для выполнения числовых вычислений, а также для того, чтобы помочь нам мыслить терминами. линий / векторов / "

ОЧЕНЬ похожие документы (опять же в отношении этого ограниченного набора размеров) будут иметь одинаковое количество ссылок на Париж И такое же количество ссылок на Лондон, или, возможно, они могут иметь такое же соотношение этих ссылок . Документ Doc2 с 2 ссылками на Париж и 8 ссылками на Лондон также будет очень похож, только с более длинным текстом или более повторяющимися названиями городов, но в той же пропорции. Может быть, оба документа представляют собой путеводители по Лондону, только вскользь упоминается Париж (и насколько он некрутой ;-) Шучу !!!.

В менее похожих документах также могут содержаться ссылки на оба города, но в разных пропорциях. . Возможно, Doc2 процитирует Париж только один раз, а Лондон - семь раз.

Вернемся к нашей плоскости xy, если мы нарисуем эти гипотетические документы, мы видим, что когда они ОЧЕНЬ похожи, их векторы перекрываются (хотя некоторые векторы могут быть длиннее), а когда они начинают иметь меньше общего, эти векторы начинают расходиться, чтобы иметь более широкий угол между ними.

Измеряя угол между векторами, мы можем получить хорошее представление об их подобии , и, чтобы упростить задачу, взяв косинус этого угла, мы получим хорошее соотношение 0 к 1 или значение от -1 до 1, которое указывает на это сходство, в зависимости от того, что и как мы учитываем. Чем меньше угол, тем больше (ближе к 1) значение косинуса, а также больше сходство.

В крайнем случае, если Doc1 цитирует только Париж, а Doc2 только Лондон, документы не имеют абсолютно ничего общего. Doc1 будет иметь вектор на оси x, Doc2 на оси y, угол 90 градусов, косинус 0. Благодаря этому интуитивному ощущению сходства, выраженному в виде небольшого угла (или большого косинуса), теперь мы можем представить вещи в трех измерениях, скажем, добавив слово «Амстердам» в микс, и довольно хорошо визуализировать, как документ с двумя ссылками на каждый будет иметь вектор, идущий в определенном направлении, и мы можем увидеть, как это направление будет сравниваться с документом, в котором по три раза упоминаются Париж и Лондон, но не Амстердам и т. д. Как уже было сказано, мы можем попытаться представить себе это причудливое пространство для 10 или 100 городов. Трудно нарисовать, но легко осмыслить.

В заключение скажу несколько слов о самой формуле . Как я уже сказал, другие источники предоставляют хорошую информацию о расчетах.

Сначала в двух измерениях. Формула для косинуса угла между двумя векторами выводится из тригонометрической разницы (между углом a и углом b):

cos(a - b) = (cos(a) * cos(b)) + (sin (a) * sin(b))

Эта формула очень похожа на формулу скалярного произведения:

Vect1 . Vect2 =  (x1 * x2) + (y1 * y2)

где cos (a ) соответствует значению x , а sin (a) значению y для первого вектора и т. Д. Единственная проблема заключается в том, что x , y и т. Д. Не совсем соответствуют значениям cos и sin , поскольку эти значения должны быть прочитаны на единичной окружности. Вот здесь и вступает в действие знаменатель формулы: при делении на произведение длины этих векторов координаты x и y нормализуются.

cos(a - b) = (cos(a) * cos(b)) + (sin (a) * sin(b))

Эта формула очень похожа на формулу скалярного произведения:

Vect1 . Vect2 =  (x1 * x2) + (y1 * y2)

где cos (a) соответствует значению x , а sin (a) значение y для первого вектора и т. д. Единственная проблема заключается в том, что x , y и т. д. не совсем соответствуют cos [ Значения 115426] и sin , поскольку эти значения должны быть прочитаны на единичной окружности. Вот тут-то и вступает в действие знаменатель формулы: при делении на произведение длины этих векторов координаты x и y нормализуются.

cos(a - b) = (cos(a) * cos(b)) + (sin (a) * sin(b))

Эта формула очень похожа на формулу скалярного произведения:

Vect1 . Vect2 =  (x1 * x2) + (y1 * y2)

где cos (a) соответствует значению x , а sin (a) значение y для первого вектора и т. д. Единственная проблема заключается в том, что x , y и т. д. не совсем совпадают с cos [ Значения 115426] и sin , поскольку эти значения должны быть прочитаны на единичной окружности. Вот здесь и вступает в действие знаменатель формулы: при делении на произведение длины этих векторов координаты x и y нормализуются.

не совсем соответствуют значениям cos и sin , поскольку эти значения необходимо читать на единичной окружности. Вот здесь и вступает в действие знаменатель формулы: при делении на произведение длины этих векторов координаты x и y нормализуются.

не совсем соответствуют значениям cos и sin , поскольку эти значения необходимо читать на единичной окружности. Вот тут-то и вступает в действие знаменатель формулы: при делении на произведение длины этих векторов координаты x и y нормализуются.

112
ответ дан 23 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: