经过一些在线研究( 1 、 2 、 numpy 、 scipy 、 scikit 、 math ),我发现了几种 在 Python 中计算欧氏距离的 方法:
# 1
numpy.linalg.norm(a-b)
# 2
distance.euclidean(vector1, vector2)
# 3
sklearn.metrics.pairwise.euclidean_distances
# 4
sqrt((xa-xb)^2 + (ya-yb)^2 + (za-zb)^2)
# 5
dist = [(a - b)**2 for a, b in zip(vector1, vector2)]
dist = math.sqrt(sum(dist))
# 6
math.hypot(x, y)
我想知道是否有人可以提供关于以上哪一项( _或我没有发现的任何其他项_)在 效率 和 精度 方面被认为是最好的见解。如果有人知道讨论该主题的任何 _资源_,那也很好。
我感兴趣的 上下文 是计算数字元组对之间的欧几里得距离,例如 (52, 106, 35, 12)
和 (33, 153, 75, 10)
之间的距离。
原文由 user6167676 发布,翻译遵循 CC BY-SA 4.0 许可协议
先说结论:
从使用
timeit
进行效率测试的测试结果,我们可以得出 关于效率的 结论:Method5 (zip, math.sqrt)
>Method1 (numpy.linalg.norm)
>Method2 (scipy.spatial.distance)
>Method3 (sklearn.metrics.pairwise.euclidean_distances )
虽然我没有真正测试你的
Method4
因为它不适合一般情况,它通常等同于Method5
。对于其余部分,令人惊讶的是,
Method5
是最快的。而对于使用Method1
的numpy
,正如我们预期的那样,它在 C 中进行了大量优化,是第二快的。对于
scipy.spatial.distance
,如果你直接进入函数定义,你会看到它实际上使用了numpy.linalg.norm
,除了它会在实际之前对两个输入向量执行验证numpy.linalg.norm
。这就是为什么它比numpy.linalg.norm
稍慢。最后对于
sklearn
,根据文档:由于在你的问题中你想使用一组固定的数据,所以这种实现的优势没有体现出来。并且由于性能和精度之间的权衡,它也给出了所有方法中最差的精度。
关于精确度,
Method5
=Metho1
= --- =Method2
= --- = --- = ----------------- =Method3
效率测试脚本:
效率测试输出:
精度测试脚本和结果: