相同向量之间的余弦距离不等于 0

Cosine distance between same vectors not equal 0

我正在尝试从向量列表中检索向量的最近邻居,使用:

neigh = NearestNeighbors(metric='cosine')

neigh.fit(list)

根据我的阅读和目睹,如果 vector1vector2 在所有维度上具有相同的精确值,从中检索的距离这两个向量将等于 0。我正在使用 kneighbors 方法来计算距离。

neigh.kneighbors(vector_input)

然而,在某些情况下(并非所有情况下)即使两个向量相等,检索到的距离也不等于 0,而是一些很小的数字,如 2.34e-16。


len([i for i, j in zip(vector_from_list,vector_input) if i == j]) returns the dimension of the list meaning that each i-index element is equal to the i-index element of the other vector. Therefore, the vectors, if I'm not wrong, are totally equal.

所有向量的 dtype 都是 np.float64


是不是求距离的方法不一致?还是我忽略了 scikit 方法中的某些内容(例如参数)?

我认为这是预期的行为。

如果您想使用距离等于零的条件,请考虑使用 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

您可以通过设置函数的其他参数来设置您希望该值接近的程度。有关更多信息,请参阅 documentation

或者,您也可以使用 python 的内置函数 math.isclose。参见 documentation。 例如,

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