我希望能够在多维空间中测量两个分布之间的距离。
例如,我想进行如Wasserstein距离或能量距离等多维度的度量,而非仅限于一维比较。
我已经找到了1D情况下的相关软件包,但是在多维度方面还未能找到。请问如何解决这个问题?
我希望能够在多维空间中测量两个分布之间的距离。
例如,我想进行如Wasserstein距离或能量距离等多维度的度量,而非仅限于一维比较。
我已经找到了1D情况下的相关软件包,但是在多维度方面还未能找到。请问如何解决这个问题?
geomloss
或dcor
包来更加普遍地实现Wasserstein和Energy距离。 geomloss
还提供了广泛的其他距离,例如hausdorff、energy、高斯和laplacian距离。默认情况下,它还使用基于pytorch
的张量框架,根据输入数据的体积使用不同的后端。
dcor
主要使用scipy.spatial.distance.pdist
和scipy.spatial.distance.cdist
计算能量距离。# create random 3D data for the test
import torch
torch.random.manual_seed(0)
X = torch.rand((3,100))
Y = torch.rand((3,100))
# energy distance with geomloss
from geomloss import SamplesLoss
Loss = SamplesLoss("energy")
# 3D tensors
Loss( X, Y ).item()
>>> 0.0063512325286865234
# 2D tensors
Loss( X[:,0:2], Y[:,0:2] ).item()
>>> 0.005196928977966309
# 1D tensors
Loss( X[:,0,np.newaxis], Y[:,0,np.newaxis] ).item()
>>> 0.004647582769393921
# energy distance with dcor
import dcor
# 3D tensors
dcor.energy_distance(X,Y)/2
>>> 0.006351688367976838
# 2D tensors
dcor.energy_distance(X[:,0:2], Y[:,0:2])/2
>>> 0.005197086538981377
# 1D tensors
dcor.energy_distance(X[:,0,np.newaxis], Y[:,0,np.newaxis])/2
>>> 0.004647575813531868
geomloss
计算的能量距离除以了二,而我想比较两个软件包之间的结果。dcor
实现要慢。
Loss = SamplesLoss("sinkhorn", blur=0.05,)
Loss( X, Y ).item()
>>> 0.01524302177131176
Loss( X[:,0:2], Y[:,0:2] ).item()
>>> 0.005164701491594315
Loss( X[:,0,np.newaxis], Y[:,0,np.newaxis] ).item()
>>> 0.0018786040600389242
除了模糊度
之外,我建议您查看此方法的其他参数,例如p
,scaling
和debias
。请注意,此方法的实现与scipy.stats.wasserstein_distance
有些不同,如果您要比较两者在1D情况下的差异,请在进行任何比较之前查看文档或代码中的定义!
flat_array1 = array1.flatten()
和 flat_array2 = array2.flatten()
,测量每个分布(我的代码是用于累积分布,但你也可以使用高斯分布) - 我在这里的函数中进行了平铺:`def ecdf(data):
'''compute eCDF of an image'''
data_flatten = data.flatten()
sort_data = np.sort(data_flatten)
values, bins = np.histogram(sort_data, normed=True)
cum_data = np.cumsum(values)
return (bins, cum_data)`
然后测量两个分布之间的距离。
比如说你有两个三维数组,想要测量它们的相似度(或者不相似度,即距离),可以使用上述函数获取分布,然后使用熵、Kullback Liebler或Wasserstein距离。