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