Косинусное расстояние между одинаковыми векторами не равно 0 - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь извлечь ближайших соседей вектора из списка векторов, используя:

ржать = ближайших соседей (метрика = 'косинус')

neigh.fit (список)

Из того, что я прочитал и засвидетельствовал, если vector1 и vector2 имеют одинаковое точное значение во всех измерениях, расстояние, полученное из этих двух векторов, будет равно 0. I Я использую метод kneighbors для определения расстояния.

neigh.kneighbors (vector_input)

Однако в некоторых случаях (не во всех случаях), даже если оба вектора равны, полученное расстояние не равно 0, но некоторые крошечные числа, такие как 2.34e-16.


len ([i для i, j в zip (vector_from_list, vector_input), если i == j]) возвращает размерность списка, означающую, что каждый элемент i-index равен i- индексный элемент другого вектора. Поэтому векторы, если я не ошибаюсь, абсолютно равны.

dtype для всех векторов: np.float64


Является ли метод определения расстояния несогласованным? Или я что-то упустил (параметр, например) в методе scikit?

1 Ответ

1 голос
/ 29 марта 2019

Я думаю, что это ожидаемое поведение.

Если вы хотите использовать условие, если расстояние равно нулю, рассмотрите возможность использования numpy.isclose . Например,

import numpy as np

a = 2.34e-16
b = 1.7e-14 # both tiny values, almost zero
print(a==b) # prints False
print(np.isclose(a,b)) # prints True

Вы можете установить, насколько близко вы хотите, чтобы значение было, установив другие параметры функции. Подробнее см. документацию .

Кроме того, вы также можете использовать встроенную функцию Python math.isclose . См. документация . Пример,

import math

a = 2.34e-16
b = 1.7e-14 # both tiny values, almost zero
print(math.isclose(a,b, abs_tol=1e-10)) # True
...