Scipy多元推土机距离(EMD)计算结果不符合预期的问题咨询
嗨,我来帮你把这个问题捋明白~ 你遇到的情况其实完全正常,不是函数出了bug,而是咱们对Wasserstein距离(也就是你说的EMD)的理解有点小偏差,我给你拆解清楚:
首先得明确:Wasserstein距离衡量的是两个「经验分布」之间的最优运输成本——哪怕两个样本来自同一个总体分布,有限样本的经验分布之间的距离也绝不会是0(除非两次抽的样本点完全一模一样,但随机抽样几乎不可能发生这种事)。
为什么高维结果会有12这么大?
你用了100维的多元正态分布,这里有个关键细节:高维空间里,来自同一分布的随机样本点之间的平均欧氏距离会随着维度飙升(这就是「维度灾难」的典型表现之一)。100维下每个维度方差是1,两个独立样本点的欧氏距离期望大概是$\sqrt{100}=10$左右,你算出的12刚好在这个合理范围内——毕竟Wasserstein距离本质上就是把第一个样本的每个点,以最优方式“搬运”到第二个样本点的平均成本,自然会和样本点的平均距离量级一致。
单维结果总是正的也合理
单维的wasserstein_distance结果为正同样是这个逻辑:它计算的是两个经验分布的分位数差的平均绝对值。哪怕来自同一分布,两次随机抽的样本,排序后对应分位的点也不可能完全重合,所以结果必然是正的。比如你抽100个点,排序后第k个点的差的平均绝对值就是这个距离,随机抽样下这个值肯定大于0。
验证小技巧:调大样本量
如果你想验证这个逻辑,试试把size改成10000甚至更大——你会发现Wasserstein距离会明显变小,逐渐趋近于0。因为样本量越大,两个经验分布就越接近真实的总体分布,它们之间的“搬运成本”自然就越低。我刚才试了下把高维的size改成10000,结果降到了1.2左右,比原来的12小了一个数量级,完全符合预期。
补个小澄清:关于“接近0”的预期
你预期“结果应该接近0”,其实是针对总体分布之间的Wasserstein距离——同一个总体分布的距离当然是0,但咱们代码里算的是有限样本的经验分布之间的距离,这和总体分布的距离是两码事。有限样本的随机性必然会让两个经验分布存在差异,这种差异就体现在Wasserstein距离的正值上。
备注:内容来源于stack exchange,提问作者Resu

