#python #numpy #scikit-learn #nearest-neighbor
#python #numpy #scikit-learn #ближайший сосед
Вопрос:
Я пытаюсь извлечь ближайших соседей вектора из списка векторов, используя :
neigh = ближайшие соседи (метрика =’cosine’)
neigh.fit(список)
Из того, что я прочитал и засвидетельствовал, если vector1 и vector2 имеют одинаковое точное значение во всех измерениях, расстояние, полученное из этих двух векторов, будет равно 0. Я использую метод kneighbors для определения расстояния.
соседние.kneighbors(vector_input)
Однако в некоторых случаях (не во всех случаях), даже если оба вектора равны, полученное расстояние равно не 0, а некоторым крошечным числам, таким как 2.34e-16.
len([i для i, j в zip(vector_from_list,vector_input), если i == j]) возвращает размер списка, означающий, что каждый элемент с i-индексом равен элементу с i-индексом другого вектора. Следовательно, векторы, если я не ошибаюсь, полностью равны.
dtype для всех векторов — np.float64
Является ли метод определения расстояния не согласованным? Или я что-то упустил (параметр, например) в методе scikit?
Комментарии:
1. Эпсилон-машина для numpy находится рядом с тем, что вы нашли: #2.22044604925e-16. Обычно используется, чтобы избежать деления на нули в numpy.
2. Да, это именно то, что я нахожу, или некоторое кратное этому значению, я думаю, для этого нет обходного пути? В моем случае я действительно хочу добавить условие, основанное на этом значении (если distance = 0)
3. не выполняйте условие dist = 0, а скорее dist<min. таким образом, вы можете избежать этой эпсилон-машины, не меняя что-либо еще. Например, установите min равным 10e-10
Ответ №1:
Я думаю, что это ожидаемое поведение.
Если вы хотите использовать условие, при котором расстояние равно нулю, рассмотрите возможность использования 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
Комментарии:
1. Большое вам спасибо! Это могло бы решить мою проблему. Я попытаюсь найти наибольшее полученное «расстояние» и указать его в качестве параметра допуска.