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

时间:2019-03-29 09:46:07

标签: python numpy scikit-learn nearest-neighbor

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

  

neigh = NearestNeighbors(metric ='cosine')

     

neigh.fit(列表)

根据我已阅读并看到的内容,如果 vector1 vector2 在所有维度上均具有相同的精确值,则从这两个向量中检索到的距离将等于0 。我正在使用 kneighbors 方法来查找距离。

  

neigh.kneighbors(vector_input)

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


  

len([i代表i,zip中的j(如果i == j,则为vector_from_list,vector_input))返回列表的尺寸,这意味着每个i-index元素都等于i其他向量的-index元素。因此,如果我没记错的话,向量是完全相等的。

所有向量的dtype为np.float64


查找距离的方法不一致吗?还是我在scikit方法中忽略了某些东西(例如参数)?

1 个答案:

答案 0 :(得分: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

您可以通过设置函数的其他参数来设置所需的接近值。有关更多信息,请参见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