问题标签 [earth-movers-distance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
271 浏览

python - 多个直方图的 wasserstein 距离

我正在尝试计算直方图之间的距离矩阵。我只能找到用于计算 2 个直方图之间距离的代码,而我的数据超过 10。我的数据是一个 CSV 文件,直方图的列加起来为 100。其中包含大约 65,000 个条目,我只运行 20 个% 的数据,但代码仍然无法正常工作。

我已经尝试过scipy.spatial.distance_matrix 中的 distance_matrix ,但它忽略了数据是直方图的面孔,并将它们视为正常的数值数据。我也尝试过 wasserstein 距离,但错误是object too deep for desired array

我希望结果有点像这样:

但这是一个错误

0 投票
1 回答
5069 浏览

python - 二维数组的Python Earth Mover距离

我想计算两个二维阵列(这些不是图像)之间的地球移动距离。

现在我浏览了两个库:scipyhttps://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wasserstein_distance.html)和pyemdhttps://pypi.org/project/pyemd /)。

虽然scipy版本不接受 2D 数组并返回错误,但pyemd方法返回一个值。如果您从文档中看到,它说它只接受一维数组,所以我认为输出是错误的。在这种情况下如何计算这个距离?

0 投票
0 回答
173 浏览

scikit-learn - t-SNE 使用推土机距离度量

我正在尝试使用带有 Wasserstrain 距离的 t-SNE 而不是欧几里得。这是我的代码的一部分:

images包含 512 张 64x64x3 的图像。有人可以告诉我我的代码是否真的符合我的要求吗?我不确定这metric=wasserstein_distance是否正确。代码工作得很好,但是当我查看 2D 空间时,它看起来很糟糕。如果我使用欧几里得度量,则 2D 图像相当不错,所以我不确定 Wasserstrain 距离是否根本不适合我的问题,或者我是否以错误的方式实现它。谢谢!

编辑:图像是固定大小的对象,在固定背景上移动。理想情况下,考虑到每个图像的一切都是相同的,除了对象的位置,我希望 2D 表示将显示对象的轨迹,即每个图像中对象的 x 和 y(或至少一些它们的可逆变换)。下面我附上了使用欧几里得距离(第一个)和 Wasserstein 距离(第二个)获得的图像。正如您所看到的,在第一种情况下,轨迹非常清晰(例如,线大多在它们应该相交的地方相交,因此拓扑大部分被保留)。在第二种情况下,一团糟。

在此处输入图像描述

在此处输入图像描述

0 投票
1 回答
818 浏览

python - 计算 3D 点云的 EMD 非常慢

我想使用 Earth Mover's Distance 和以下代码计算两个至少有 2000 个点的 3D 点云之间的距离,但是它太慢并且无法正常工作。那么,有什么方法可以更快地计算出近似值吗?

0 投票
1 回答
3852 浏览

python - python中wasserstein距离函数的参考

我们试图计算两个离散的一维分布之间的距离。我们的目的是计算一个遵循最优传输直觉的距离函数:我们的分布是“点”处的质量,即向量,对每个向量中元素的顺序很重要。给定一个描述任意两点之间距离的矩阵,我们想在 u 中找到最小成本的运输,以使其成为 v。

最简单的例子是:设 u,v 为分布:u=(0.5,0.2,0.3), v=(0.5,0.3,0.2)

假设距离矩阵是 [[1,1,1],[1,1,1],[1,1,1]],这意味着在任意两点之间移动质量单位的成本为 1。显然,使 u 看起来像 v 的最佳方法是将 0.1 从第三点传输到第二点。在这种情况下,成本将为 1*0.1,即 0.1。

按照这种直觉,我们转向了 Wasserstein 距离。我们已经尝试过scipy.stats.wasserstein_1dPOT包 - 特别是 ot.emd2。然而,没有人真正计算出我们想要的,关于上面的例子,第一个不考虑向量中元素的顺序,所以结果是 0。第二个算法返回 1

我们非常感谢我们可能错过的关于这两个 python 函数的操作的任何解释,或者任何其他参考或建议。

  • 我们知道,给定一个非对称距离度量,这个“距离”的概念将不是对称的。
0 投票
1 回答
336 浏览

python - scipy.stats.wasserstein_distance 实现

我试图了解 scipy.stats.wasserstein_distance中使用的实现

对于p=1并且没有权重,使用u_valuesv_values两个一维分布,代码归结为

u_sorter = np.argsort(u_values)(1)
v_sorter = np.argsort(v_values)

all_values = np.concatenate((u_values, v_values))(2)
all_values.sort(kind='mergesort')

deltas = np.diff(all_values)(3)

u_cdf_indices = u_values[u_sorter].searchsorted(all_values[:-1], 'right')(4)
v_cdf_indices = v_values[v_sorter].searchsorted(all_values[:-1], 'right')

v_cdf = v_cdf_indices / v_values.size(5)
u_cdf = u_cdf_indices / u_values.size

return np.sum(np.multiply(np.abs(u_cdf - v_cdf), deltas))(6)

这个实现背后的原因是什么,是否有一些文献?我确实看过引用的论文,我相信它解释了为什么在一维的一般定义中计算 Wasserstein 距离等同于评估积分,


\int_{-\infty}^{+\infty} |U-V|,

与 U 和 V 分布的累积分布函数u_valuesv_values
但我不明白如何在 scipy 实现中评估这个积分。

特别是,
a) 为什么它们乘以 (6) 中的增量来求解积分?
b)在 (5) 中,累积分布函数 U 和 V 如何v_cdfu_cdf

此外,通过这种实现,分布的元素顺序u_values不会v_values被保留。在一般的 Wasserstein 距离定义中不应该是这种情况吗?

谢谢您的帮助!

0 投票
0 回答
479 浏览

python - 两个分布python之间的Wasserstein距离

我有一些数据在事件发生前后的分布。我想找到这两个分布之间的距离。换句话说,我需要在多大程度上扩展活动前的分布才能接近活动后的分布?我认为 Wasserstein 距离似乎很适合我的问题,但我有一些疑问:

  1. 分布为:X轴为天数,Y轴为当天数据点数。如何将这两列作为输入传递给 scipy.stats.wasserstein_distance ?
  2. 事后分布比事前分布更长尾。测量 X 轴幅度变化以及 Y 轴增加的最佳距离度量是什么?

这是真实数据集的示例图,蓝色是事件发生前,橙色是事件发生后。我的最终目标是从这样的分布中学习并概括一个比例因子,即我需要多少缩放我的事件前分布才能达到事件后分布?

1同一对象的两个分布。 蓝色是事件发生前,橙色是事件发生后

0 投票
2 回答
349 浏览

python - 找到一些以 EMD 作为距离度量的直方图的“中心”

给定相同数量的桶的一些直方图,我需要找到这些直方图的“中心”。“中心”是一个直方图,使得地球移动器与所有其他直方图的距离之和最小。

例如,给定 4 个直方图A, B, C, D,算法需要输出一个新的直方图X,使得它EMD(X, A) + EMD(X, B) + EMD(X, C) + EMD(X, D)是最小值。

简单算术平均找不到“中心”,这里是一个例子。

我需要计算数百万直方图的“中心”,那么如何有效地找到“中心”。如果不存在快速算法,是否有任何好的近似值?

=== 编辑 ===

添加了一个示例来澄清我的问题。

0 投票
0 回答
55 浏览

python - python函数输入参数中的空格,因为它是一个cython函数?

我对cython一无所知,只有python。

下面的函数emd_c来自pot最佳传输包)有一个头文件,它的参数格式我以前从未见过,或者我认为在独立的 python/numpy 下不能工作,但也许只有在加载 cython 的情况下。

def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mode="c"] b, np.ndarray[double, ndim=2, mode="c"] M, int max_iter):

如您所见,参数本身([] a, [] b, [] M)中有空格,这通常是非法的。

我想单独使用这个函数,而不是安装它来自的整个包:

将函数从它来自的包中复制出来,并将函数本身粘贴到我自己的脚本中,invalid syntax当我尝试运行我的脚本时,Spyder 立即给了我一个错误,即使我只期望与缺少依赖项有关的错误。我在这里的问题只与试图理解这个看起来很奇怪的函数有关。

  1. 什么解释了这个函数中输入参数的奇怪格式?是因为它不符合 python-in-isolation 并且还需要 cython 吗?
  2. 如何使这种功能正常运行?
0 投票
0 回答
219 浏览

r - 如何为序数分类问题自定义 XGBoost 目标函数?

我正在训练一个模型来对具有 10 个级别的序数响应变量进行分类。

我研究了一篇名为“Squared Earth Mover's Distance-based Loss for Training Deep Neural Networks”(https://arxiv.org/pdf/1611.05916.pdf)的论文,我想自定义 XGBoost 目标函数以在“ EMD”。

但是,我不知道如何编写该目标函数。除了使用multi:softmaxor multi:softprob,任何人都可以帮我编写一个满足 EMD 的定制目标函数吗?