Вам нужно нормализовать ваши данные перед использованием scipy.spatial.distance.cosine () в python? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть два набора данных D1 и D2. Каждый набор данных имеет n объектов (столбцов), а значения объектов имеют разные масштабы. Мне нужно найти косинусное расстояние между каждой соответствующей парой выборок в D1 и D2, чтобы количественно определить, насколько похожи D1 и D2. Нужно ли нормализовать D1 и D2 перед использованием косинусного расстояния? Я использую scipy.spatial.distance.cosine (u, v), чтобы найти расстояние между образцом u и образцом v.

Спасибо!

1 Ответ

0 голосов
/ 26 марта 2020

Нужно ли нормализовать данные перед использованием scipy.spatial.distance.cosine () в python?

Если "нормализация" данных предполагает только умножение входных данных на скаляра то нет, нормализовать не нужно. Проверьте формулу для расстояния в строке документа . Теперь предположим, что a и b являются положительными скалярами. Тогда

cosine(a*u, b*v) = 1 - dot(a*u, b*v)/(norm(a*u)*norm(b*v))
                 = 1 - a*b*dot(u, v)/(a*b*norm(u)*norm(v))
                 = 1 - dot(u, v)/(norm(u)*norm(v))
                 = cosine(u, v)

Таким образом, коэффициент масштабирования, который вы использовали бы для нормализации ввода, будет отменен и не повлияет на результат.

Это можно увидеть на простом примере:

In [17]: from scipy.spatial.distance import cosine

In [18]: u = np.array([1.0, 3.0, 5.0, 10.0])

In [19]: v = np.array([-3.0, 1.0, 0.0, 2.0])

In [20]: cosine(u, v)
Out[20]: 0.5399562937717639

In [21]: cosine(u/10, v)
Out[21]: 0.5399562937717639

In [22]: cosine(3*u, 4*v)
Out[22]: 0.5399562937717639
...