首页 > 解决方案 > 计算欧几里得距离的python方法的精度有什么不同吗?

问题描述

我正在一个 numpy 数组中逐个数组计算欧几里得距离数组。我习惯np.linalg.norm(v1-v2)了这个。由于我计划使用其他距离度量,因此我将其更改为scipy.spatial.distance.euclidean(v1,v2)在代码中保留模式。

我注意到在每种情况下,最后一位数字都有所不同。我认为它不会因为 scipy euclidean 版本使用来自 numpy 核心的函数,比如dotand 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 是标准化直方图。
为什么精度会有这种差异?这应该发生吗?

标签: pythonnumpyscikit-learnscipyeuclidean-distance

解决方案


浮点数以分数形式存储在计算机中,用 53 位表示分子。因此,您无法获得精度超过 15 位有效数字的浮点答案。 https://docs.python.org/3/tutorial/floatingpoint.html


推荐阅读