wasserstein距离(最优传输距离:
Wasserstein Distance也称为推土机距离(Earth Mover’s distance, EMD),Wasserstein Distance的定义是评估由P分布转换成Q分布所需要的最小代价(移动的平均距离的最小值)→和挖东墙补西墙类似(把一个形状转换成另一个形状所需要做的最小工),所以经常查到Wasserstein Distance称为推土机距离。
Wasserstein Distance范例1:
假设有两个分布P分布和Q分布,这里用离散的分布介紹,(假设x1→x2、x2→x3、x3→x4、x4→x5距离都是1)
这里举3个不同移动的方式,将P移动成Q
方法1:
方法2:
方法3:
三个方法的移动动量都是8。这是个简单的范例应该没有更短的移动方式,所以此范例的Wasserstein Distance/EMD = 8,但实际上Wasserstein Distance/ EMD计算要进行标准化去移动(考虑总数14个): 所以Wasserstein Distance = 8/14=4/7= 0.5714
python程序(利用scipy函数)计算
import scipy.stats
import numpy as np
P = np.array([3,5,2,1,3])
Q = np.array([2,3,4,5,0])
dists=[i for i in range(len(P))]
D=scipy.stats.wasserstein_distance(dists,dists,P,Q)
print(D)
ANS: 0.5714285714285714
实际上P和Q的分布是长得像下图,所以在用scipy计算Wasserstein Distance输入项,前两项是在看在X轴的位置,所以我用[0,1,2,3,4]作为前两项输入,來计算Wasserstein Distance。
Wasserstein Distance范例2:
假设有两个分布P分布和Q分布,这里用离散的分布介紹,(假设x1→x2、x2→x3、x3→x4、x4→x5、x5→x6距离都是1)
这里举例一种移动的方式,将P移动成Q
移动动量都是12。这是个简单的范例应该沒有更短的移动方式,此范例计算要标准化去移动(考虑总数4个): 所以Wasserstein Distance = 12/4=3
python程序计算
import scipy.stats
import numpy as np
P = np.array([1,2,1])
Q = np.array([1,2,1])
dists_P=[0,1,2]
dists_Q=[3,4,5]
D1=scipy.stats.wasserstein_distance(dists_P, dists_Q, P, Q)
print(D1)
ANS: 3.0
实际上P和Q的分布是长得像下图,所以在用scipy计算Wasserstein Distance输入项,前两项是在看在X轴的位置,所以在P分布用[0,1,2],Q分布是用[4, 5, 6]作为前两项输入,来计算Wasserstein Distance。
聪明的你应该发现了:
推土法的移动我在范例一中可以找到3种不同移动方式(范例二其实也可以我懒了),所以没有固定的移动方式都可以找到最小的移动量,前面两各范例都提到“这是各简单的范例应该没有更短的移动方式”,那是因为范例简单,如果实际的分布超级复杂我们怎么这样慢慢移动用肉眼找到最小解。
Wasserstein Distance公式
wasserstein距离(Earth Mover’s Distance)公式:
从P分布移动到Q分布,假设P有M堆土(在P的第i堆有pi质量的土),Q有N堆土(在Q的第j堆还能存放qj质量的土)。
d_ij表示从P的第i堆移动到Q的第j堆的距离。(成本函数,已知)
f_ij表示从P的第i堆移动到Q的第j堆的土的质量。(控制变量,待求,待优化)
所以从P移动到Q的总花费为
<D,F>_F为计算D和F的弗罗贝尼乌斯系数(Frobenius Norm)
wasserstein距离就是求最小的P移动到Q所花费的成本。
求wasserstein距离有一些限制条件:
- f i j > 0 f_{ij}>0 fij>0,即只能从P移动到Q不能反向
- ∑ j = 1 N f i j < = p i \sum_{j=1}^{N}f_{ij}<=p_i ∑j=1Nfij<=pi,每次最多转移P第i堆已有的土量
- ∑ i = 1 M f i j < = q j \sum_{i=1}^{M}f_{ij}<=q_j ∑i=1Mfij<=qj,每次最多转移Q的每个土堆最大的存放量
所以在目标函数与限制都满足的状态下,找到的最佳F* (最小化P移动到Q所花费的移动次数和量)就是我们要求的wasserstein距离,即EMD,
我们看一下前面范例一的方法1写成方程式会长什么样,
假设这个解(F*)最好:
当然有些文章会用下面两种方式定义Wasserstein distance
- 假设有量分布P和Q
所以在某联合分布下,此分布下求的所有x和y的距离期望值,而这个期望值的下界(infimum,也就是方程式內的inf)就是的Wasserstein distance。
1. Scipy定义的1D分布的Wasserstein distance:
The first Wasserstein distance between distribution u and v:
在scipy定义的1D的Wasserstein distance,其实为(1)方程式利用期望值式子展开后的结果。其实Wasserstein distance可以从累积分布函数(Cumulative Distribution Function、CDF)來计算。
我们用CDFs的方式来计算前两个范例的Wasserstein distanc给大家看
范例1:
所以此范例基于CDF(累积分布函数)计算的Wasserstein distance 。(我们算完再除上总数14个)
范例2
所以此范例基于CDF(累积分布函数)计算的Wasserstein distance (我们算完再除上总数4个)