如何计算两个连续经验分布的Wasserstein距离/EMD距离?
连续分布与样本集的Wasserstein距离计算
实现方案
你想要的功能完全可以通过scipy.stats.wasserstein_distance直接实现,这个函数本身就支持长度不同的输入数组,不需要强制两者维度相等。核心思路是用大样本近似目标连续分布,再和实际数据的经验分布计算Wasserstein距离。
可运行代码
import numpy as np from scipy.stats import wasserstein_distance # 替换为你的实际实数数组,长度任意 actual_data = np.random.randn(3000) # 示例数据 # 生成足够多的标准正态分布样本,近似连续分布 continuous_samples = np.random.normal(0, 1, 100000) # 直接计算距离 distance = wasserstein_distance(actual_data, continuous_samples) print(distance)
原理说明
wasserstein_distance基于两个样本的经验累积分布函数(ECDF)计算,无论输入数组长度是否一致,都会分别计算两者的ECDF,再计算对应分位点的加权距离之和。- 当连续分布的样本量足够大(如100000个)时,其ECDF会非常接近真实连续分布的累积分布函数(CDF),此时计算出的距离可近似看作实际数据经验分布与目标连续分布的Wasserstein距离。
注意点
- 样本量越大,对连续分布的近似精度越高,但计算速度会略有下降,100000个样本是精度与速度的合理平衡点。
- 如果实际数据量极小,可先通过核密度估计对数据做平滑处理后再计算,常规场景下直接使用原始数据即可。
内容的提问来源于stack exchange,提问作者Henry Page
相关产品推荐
相关产品推荐

