是否有定向版本的地球移动距离

时间:2012-04-04 14:54:32

标签: algorithm metric

我目前有一个问题,我想比较两个1D发行版。我是我的情况我试图找到我有多少移动其中一个分布将其转换为另一个,所以我会使用地球移动距离进行比较。但是,我也对分配转移到另一个分配的实际方向感兴趣。

1D中是否有定向版本的推土机距离?

更准确地说,我有两个分布f : {1...N} -> |Rg : {1...N} -> |R我必须互相转向。现在我想将从f中的箱子移动的污垢量增加到g中的箱子,但我想说明方向。即如果“垃圾”从垃圾箱x移到垃圾箱y,我希望将我移动的数量乘以x-y而不是d(x,y),就像标准推土机距离一样。然后我想找到最小化移动地球总量的运动。

我可以使用已知的算法吗?我想我应该可以为此修改原始的匈牙利算法,但我不知道如何做到这一点,因为我之前从未使用过这个算法。

3 个答案:

答案 0 :(得分:1)

你的“距离”是平均值(f) - 平均值(g)。为了最大限度地减少移动的地球总量而不考虑移动的距离,贪婪算法可以实现最优,即分布之间的统计距离。

答案 1 :(得分:1)

因此,如果我正确理解你的问题,那么我认为下面的代码(在Go中)会解决。如果你可以假设每个分布上的积分是相等的(意味着可以将一个转换为另一个),然后从左到右移动您的分布,并在每个点找出需要从右侧移动多少污垢,或需要从那里向左移动多少多余的污垢。在所有情况下,您都可以假设您需要的任何污垢都可以获得,因此可以暂时使用“负”污垢。

// Finds out how to move dirt to transform b into a.
// assumes that the integrals over a and b are equal
func earthMover(a, b []int) []int {
  r := make([]int, len(a))
  for i := 0; i < len(a); i++ {
    // if diff is positive it means that there is too much dirt here and it
    // must be moved to the right.  if it is negative it means some dirt
    // needs to be pulled in from the right.  In either case dirt can be
    // moved over multiple spaces.
    diff := b[i] - a[i]
    r[i] = diff
    b[i] -= diff
    if i < len(a) - 1 {
      b[i+1] += diff
    }
  }
  return r
}

这是一个例子。负数表示污垢从右侧拉入,正数表示从左侧向右侧推动。我认为对于您的指标,您只需总结移动数组中的所有数字,因此此案例的解决方案为5。

target: [ 3  0  1  0  2  6]
source: [ 1  1  5  0  1  4]
  move: [-2 -1  3  3  2  0]

现在我看到了,如果这实际上是你想要的,那么你真的在寻找分布的加权平均值或质心(污垢)的差异。例如:

            0  1  2  3  4  5
  target: [ 3  0  1  0  2  6]
weighted:   0 +0 +2 +0 +8+30 = 40

  source: [ 1  1  5  0  1  4]
weighted:   0 +1+10 +0 +4+20 = 35

如您所见,目标的质心减去源的质量中心是我们之前得到的数字,40 - 35 = 5.

答案 2 :(得分:0)

https://github.com/wihoho/VideoRecognition

  • 通过文件界面
  • 调整作者的C implementation和python模块
  • 修改后的C代码位于EarthMoverDistance SourceCode
  • 文件夹下