Все задачи
Легко Решено: 0 Процент решений: 0%

Косинусное сходство

Измерьте сходство двух векторов по углу между ними, как это делают поисковые системы с эмбеддингами.

Чему вы научитесь

  • Измерять сходство по углу
  • Вычислять скалярные произведения и нормы
  • Понять, как семантический поиск сравнивает тексты

Условие

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

cos(a, b) = (a · b) / (|a| × |b|), где |a| = √(a₁² + a₂² + … + aₙ²)

Результат равен 1 для одинакового направления, 0 для перпендикулярных векторов и -1 для противоположных направлений. Если один из векторов состоит только из нулей, верните 0.

Реализуйте cosine_similarity(a, b).

Входные данные

a, b: два списка чисел одинаковой длины.

Выходные данные

Верните косинусное сходство как дробное число.

Ограничения

1 ≤ длина ≤ 1000

-1000 ≤ каждое значение ≤ 1000

Примеры

Пример 1
Ввод:
a = [1.0, 0.0]
b = [0.0, 1.0]

Ожидаемый вывод:
expected = 0.0
Ввод:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};

Ожидаемый вывод:
double expected = 0.0;
Ввод:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};

Ожидаемый вывод:
double expected = 0.0;

Пояснение

Скалярное произведение равно 0, поэтому векторы перпендикулярны и сходство равно 0.

Пример 2
Ввод:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]

Ожидаемый вывод:
expected = 1.0
Ввод:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};

Ожидаемый вывод:
double expected = 1.0;
Ввод:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};

Ожидаемый вывод:
double expected = 1.0;

Пояснение

b — это a, умноженный на 2: направление то же, поэтому сходство равно 1, хотя длины разные.

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.