Wasserstein距离的python代码直观解释scipy.stats.wasserstein_distance用法

Wasserstein距离的python代码实现scipy.stats.wasserstein_distance解释

在官方文档scipy.stats.wasserstein_distance --- SciPy v1.8.0.dev0+1869.838cfbe Manual (osgeo.cn)页面中

python 复制代码
scipy.stats.wasserstein_distance(u_values, v_values, u_weights=None, v_weights=None)

对参数u_values,v_value,u_weights,v_weights解释不清晰。

通过看文章Wasserstein距离的直观解释_em距离-CSDN博客对Wasserstein距离的理解和对样例的测试。对搜索引擎多次指向的一篇文章博客EMD距离wasserstein_distance的使用_推土机距离-CSDN博客进行勘误。

库的应用

我们对文章中使用到的样例进行计算

  • 正确调用方法为:

    python 复制代码
    from scipy.stats import wasserstein_distance
    # 对权重未归一化
    wd1 = wasserstein_distance([0,1,2,3],[0,1,2,3], [4,2,1,3],[3,1,2,4])
    # wd1 = 0.4
    
    # 前面两个u_values,v_value值不同
    wd2 = wasserstein_distance([1,2,3,4],[1,2,3,4], [4,2,1,3],[3,1,2,4])
    # wd2 = 0.4
    # u_values,v_value 值变化
    wd3 = wasserstein_distance([0,1,3,4],[0,1,3,4], [4,2,1,3],[3,1,2,4])
    # wd3 = 0.6
    # 对示例中的进行归一化处理
    wd4 = wasserstein_distance([0,1,2,3],[0,1,2,3], [4/10,2/10,1/10,3/10],[3/10,1/10,2/10,4/10])
    # wd4 = 0.4

    前面的u_values,v_value可以理解为槽位 ,后面的权重u_weights,v_weights理解为箱子Wasserstein距离 就是,我们现在需要将上方的箱子,挪成下面的箱子的堆放形状,移动箱子的距离最小。

    wd1和wd2: wd1和wd2中槽位的相距都是1,虽然位置在坐标中不同,但计算出来的距离是一样的。可以这样理解,槽位的位置不管在小明家还是小丽家,只要他们箱子摆放形状和槽位的方位和距离保持一致,搬动箱子的距离是固定的。

    wd1和wd3: wd1和wd3中槽位在坐标x的方位不变,但是wd3中,槽位1,2和槽位3,4距离中间变大,最终距离计算为0.6比wd1=0.4大。可以这样理解,虽然都是搬箱子,且方位前后一致,但是,由于箱子中间距离变大,搬箱子搬动的距离增大。

    wd1和wd4: wd1和wd3中,后面权重不一样,但是wd1会默认转换为wd4.

  • 错误调用示范

    文章EMD距离wasserstein_distance的使用_推土机距离-CSDN博客 中按照其写的方式,直接调用为:

    python 复制代码
    x0 = wasserstein_distance([0, 1, 3], [0, 1, 3])		#相同的分,分布的差异为0
    x1 = wasserstein_distance([3, 1, 0], [0, 1, 3])		#相同分布,但元素顺序打乱,分布的差异值仍然为

    为什么x0和x1计算出来的值一样?因为x0和x1的槽位是一样的,但是权重系统固定分配一样,在槽位上默认摆放的箱子数量是相同的。和下面代码调用效果一样。x1可以理解为,在坐标3,1,0处各有一个箱子,现在要将箱子搬到0,1,3处各有一个箱子,那显然我们不用搬动任何箱子即可实现。故距离为0。

    python 复制代码
    x0 = wasserstein_distance([0, 1, 3], [0, 1, 3],[1,1,1],[1,1,1])		#相同的分,分布的差异为0
    x1 = wasserstein_distance([3, 1, 0], [0, 1, 3],[1,1,1],[1,1,1])		#相同分布,但元素顺序打乱,分布的差异值仍然为 

总结

调用该库计算距离时,应该将要计算的分布放在权重位置,即u_weights,v_weights。而在u_values,v_value中按照使用习惯。只需要传递分布的下标即可

好文推荐

Wasserstein距离的直观解释_em距离-CSDN博客

相关推荐
u0109147602 小时前
CSS组件库如何快速扩展_通过Sass @extend继承基础布局
jvm·数据库·python
baidu_340998822 小时前
Golang怎么用go-noescape优化性能_Golang如何使用编译器指令控制逃逸分析行为【进阶】
jvm·数据库·python
m0_678485452 小时前
如何利用虚拟 DOM 实现无痕刷新?基于 VNode 对比的状态保持技巧
jvm·数据库·python
不吃香菜学java2 小时前
Redis的java客户端
java·开发语言·spring boot·redis·缓存
qq_342295822 小时前
CSS如何实现透明背景效果_通过RGBA色彩模式控制透明度
jvm·数据库·python
TechWayfarer2 小时前
知乎/微博的IP属地显示为什么偶尔错误?用IP归属地查询平台自检工具3步验证
网络·python·网络协议·tcp/ip·网络安全
Greyson13 小时前
CSS如何处理超长文本换行问题_结合word-wrap属性
jvm·数据库·python
justjinji3 小时前
如何批量更新SQL数据表_使用UPDATE JOIN语法提升效率
jvm·数据库·python
小江的记录本3 小时前
【网络安全】《网络安全常见攻击与防御》(附:《六大攻击核心特性横向对比表》)
java·网络·人工智能·后端·python·安全·web安全
贵沫末3 小时前
python——打包自己的库并安装
开发语言·windows·python