栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

欧氏距离的高效精确计算

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

欧氏距离的高效精确计算

结论第一:

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
,除了它将在real之前对两个输入向量执行验证
numpy.linalg.norm
。这就是为什么它慢一点的原因
numpy.linalg.norm

最后对于

sklearn
,根据文档:

与其他计算距离的方式相比,此公式具有两个优点。首先,在处理稀疏数据时它的计算效率很高。其次,如果一个参数变化而另一个参数保持不变,则可以预先计算点(x,x)和/或点(y,y)。但是,这不是进行此计算的最精确方法,并且此函数返回的距离矩阵可能未按要求完全对称

由于在您的问题中您想使用一组固定的数据,因此未体现此实现的优势。而且由于性能和精度之间的权衡,它在所有方法中也给出了最差的精度。

关于精度

Method5
=
Metho1
=
Method2
>
Method3

效率测试脚本:

import numpy as npfrom scipy.spatial import distancefrom sklearn.metrics.pairwise import euclidean_distancesimport math# 1def eudis1(v1, v2):    return np.linalg.norm(v1-v2)# 2def eudis2(v1, v2):    return distance.euclidean(v1, v2)# 3def eudis3(v1, v2):    return euclidean_distances(v1, v2)# 5def eudis5(v1, v2):    dist = [(a - b)**2 for a, b in zip(v1, v2)]    dist = math.sqrt(sum(dist))    return distdis1 = (52, 106, 35, 12)dis2 = (33, 153, 75, 10)v1, v2 = np.array(dis1), np.array(dis2)import timeitdef wrapper(func, *args, **kwargs):    def wrapped():        return func(*args, **kwargs)    return wrappedwrappered1 = wrapper(eudis1, v1, v2)wrappered2 = wrapper(eudis2, v1, v2)wrappered3 = wrapper(eudis3, v1, v2)wrappered5 = wrapper(eudis5, v1, v2)t1 = timeit.repeat(wrappered1, repeat=3, number=100000)t2 = timeit.repeat(wrappered2, repeat=3, number=100000)t3 = timeit.repeat(wrappered3, repeat=3, number=100000)t5 = timeit.repeat(wrappered5, repeat=3, number=100000)print('n')print('t1: ', sum(t1)/len(t1))print('t2: ', sum(t2)/len(t2))print('t3: ', sum(t3)/len(t3))print('t5: ', sum(t5)/len(t5))

效率测试输出:

t1:  0.654838958307t2:  1.53977598714t3:  6.7898791732t5:  0.422228400305

精密测试脚本和结果:

In [8]: eudis1(v1,v2)Out[8]: 64.60650122085238In [9]: eudis2(v1,v2)Out[9]: 64.60650122085238In [10]: eudis3(v1,v2)Out[10]: array([[ 64.60650122]])In [11]: eudis5(v1,v2)Out[11]: 64.60650122085238


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/633942.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号