python - 相同向量之间的余弦距离不等于 0
问题描述
我正在尝试从向量列表中检索向量的最近邻居,使用:
neigh = NearestNeighbors(metric='余弦')
neigh.fit(列表)
根据我的阅读和见证,如果vector1和vector2在所有维度上具有相同的精确值,则从这两个向量检索到的距离将等于 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])返回列表的维度,这意味着每个 i-index 元素等于另一个向量的 i-index 元素。因此,如果我没记错的话,向量是完全相等的。
所有向量的 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
您可以通过设置函数的其他参数来设置您希望该值有多接近。有关更多信息,请参阅文档。
或者,您也可以使用 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
推荐阅读
- nativescript - 强制焦点到 ListView 中的某个索引
- python - get_legend_handles_labels() 不返回新的图例数据
- javascript - 需要两次 getElementById 才能在 Javascript 中获得正确的值
- java - Spring ConversionFailedException 无法序列化为 JSON
- html - 位置粘性在 Firefox 中有效,在 Chrome 中无效
- ionic-framework - 如何修复此提供程序以使其在 Ionic 3 中工作
- windows - 从后台进程将窗口带到前台
- python - 如何在groupby之后重新组合系列?
- user-interface - 如何使用他们的 UI 显示 Google Calendar API 结果?
- asp.net - 如何使用 asp.net MVC 为 DropDownListFor 中的每个条目添加一个字符串?