python - 计算欧几里得距离的python方法的精度有什么不同吗?
问题描述
我正在一个 numpy 数组中逐个数组计算欧几里得距离数组。我习惯np.linalg.norm(v1-v2)
了这个。由于我计划使用其他距离度量,因此我将其更改为scipy.spatial.distance.euclidean(v1,v2)
在代码中保留模式。
我注意到在每种情况下,最后一位数字都有所不同。我认为它不会因为 scipy euclidean 版本使用来自 numpy 核心的函数,比如dot
and sqrt
。我在 Python 中尝试了其他方法来计算要比较的欧几里得距离,对于一个具体的例子,我得到了这些结果。
>>> math.sqrt(sum([(a-b)**2 for a,b in zip(v1,v2)]))
1.0065822095995844
>>> numpy.linalg.norm(v1-v2)
1.0065822095995838
>>> sklearn.metrics.pairwise.euclidean_distances(v1.reshape(1,-1),v2.reshape(1,-1))[0,0]
1.0065822095995838
>>> scipy.spatial.distance.euclidean(v1,v2)
1.006582209599584
仅作记录,在我的示例中,v1 和 v2 是标准化直方图。
为什么精度会有这种差异?这应该发生吗?
解决方案
浮点数以分数形式存储在计算机中,用 53 位表示分子。因此,您无法获得精度超过 15 位有效数字的浮点答案。 https://docs.python.org/3/tutorial/floatingpoint.html
推荐阅读
- c# - 在这种情况下如何创建 Edit 方法?ASP.NET 核心 MVC
- python - 在 Python 中为多个数据帧动态使用连接条件
- javascript - 如何将日期格式化为 (dd/mm/yyyy hh:mm:ss)
- list - 如何在 if 条件之后打印产品列表的完整最后索引,因为它显示“产品实例”
- android - rsync Android / TWRP
- reactjs - 重新部署 React 应用程序时 Nginx 服务器经常停机?
- html - CSS 类可以根据特定子项是否存在而改变吗?
- angularjs - 使用角度js和ngrepeat从rest api调用的下拉列表中填充数据
- cypress - 赛普拉斯应该失败测试继续运行
- excel - 复制前检查目标表的数据