【问题标题】:Modifying a Levenshtein distance function to calculate distance between two sets of x-y coordinates?修改 Levenshtein 距离函数以计算两组 x-y 坐标之间的距离?
【发布时间】:2010-01-17 22:40:06
【问题描述】:

我一直在尝试修改 Levenshtein 距离函数,以便它可以找到两条线之间的距离,或 x-y 坐标集(换句话说,线的相似或不同程度,而不是它们的几何距离) .我遇到了一些问题。我知道您如何使用上面的值来获得删除成本,以及左侧的值来获得加法,但是在替换过程中我试图使用欧几里得距离,它对我不起作用。

如果你能指出我做错了什么,那就太棒了。

以下是javascript中的相关代码:

padlock.dtw = {
    _deletionCost: 1,
    _insertionCost: 1,
    levenshtein: function(a,b){
        var l1 = a.length, l2 = b.length;
        if (Math.min(l1, l2) === 0) {
            return Math.max(l1, l2);
        }
        var i = 0, j = 0, d = [];
        for (i = 0 ; i <= l1 ; i++) {
            d[i] = [];
            d[i][0] = i;
        }
        for (j = 0 ; j <= l2 ; j++) {
            d[0][j] = j;
        }
        for (i = 1 ; i <= l1 ; i++) {
            for (j = 1 ; j <= l2 ; j++) {
                d[i][j] = Math.min(
                    d[i - 1][j] + this._deletionCost, /* deletion */
                    d[i][j - 1] + this._insertionCost, /* addition */
                    d[i - 1][j - 1] + (a[i - 1] === b[j - 1] ? 0 : this.euclideanDistance(a[i-1], b[j-1])) /* substitution, use euchlidean distance as cost */
                );
            }
        }
        this._debugPrintMatrix(d);
        return d[l1][l2];
    },
    euclideanDistance: function(a, b){
        var xd = a[0]-b[0];
        var yd = a[1]-b[1];
        return Math.abs(Math.sqrt(Math.pow(xd, 2) + Math.pow(yd, 2)));
    },
    _debugPrintMatrix: function(m){
        for(var i=0;i<m.length;i++){
            console.log.apply(this, m[i]);
        }
    }
}

示例输出:

>>> padlock.dtw.levenshtein( [ [1,1], [0,9], [3,3], [4,4] ], [ [1,1], [2,2], [3,3], [4,4] ] )

Distance Matrix:
0 1 2                 3 4
1 0 1                 2 3
2 1 2                 3 4
3 2 2.414213562373095 2 3
4 3 3.414213562373095 3 2

Final Distance: 2

【问题讨论】:

  • 我希望您知道有一些更简单的方法可以“找到两条线之间的距离,或 x-y 坐标集”
  • 当我说“距离”时,我的意思更多的是两条线的相似或不同。
  • 我认为这是一个统计问题,而不是几何问题。
  • 顺便说一句,您可以使用勾股定理求两点之间的距离。

标签: javascript distance levenshtein-distance


【解决方案1】:

如果我正确理解了您的问题,那么您应该完全删除计算两点之间欧几里得距离的代码!

首先,让我重申你的问题:

你有两组点,例如

A = [ [1,1], [0,9], [3,3], [4,4] ]
B = [ [1,1], [2,2], [3,3], [4,4] ]

您尝试计算这两组之间的 levenshtein 距离。你用“点”代替“字母”。

到目前为止,这是有道理的。只需将 levenshtein 算法中的“字母”替换为点即可!

但你犯了一个错误:原来的 Levenshtein 算法不计算两个字母之间的距离,例如距离(a,b)=1 或距离(a,d)=3。

你试图用这样的东西来扩展算法(使用 euclideanDistance() 函数)。但是 levenshtein 算法不适用于此类事情。如果你仔细观察它,你会发现它不起作用(矩阵中的值是有意义的,并且每次循环迭代都使用矩阵中在前一次迭代中计算的值)。

Levenshtein 距离是编辑距离,不是几何距离。您尝试更改它,以便它计算编辑和几何距离的混合。恕我直言,这种混合毫无意义,既无用又错误。

结论

要计算两组 x-y 坐标的 levenshtein 距离,您应该将 euclidianDistance() 替换为简单的相等比较 (a[0]==b[0] &amp;&amp; a[1]==b[1])。

然后levenshtein算法会给你一个“编辑距离”。

【讨论】:

    【解决方案2】:

    用几何学计算两条线之间的距离不是更聪明吗? 或者您是否有特定的原因不想使用它。

    由于两条线总是有一个交点,除非它们是平行的(编辑,谢谢),因此很容易计算出最小距离:即 0 或 插入一些数学运算,这可以可以在谷歌上找到

    【讨论】:

    • 你的意思是除非它们是平行的
    • 当我说“距离”时,我的意思更多的是两条线的相似或不同之处。
    • 请注意,提问者谈论的是两个“x-y 坐标集”,而不仅仅是两个 x-y 坐标。你不能以任何确切的方式在两组点之间画一条线。
    • 问题确实说“两条线之间的距离,或 x-y 坐标集”,这些陈述放在一起没有意义。
    【解决方案3】:

    我不明白您为什么要为此使用 Levenshtein,看来您可以通过简单的计算获得更好的结果。

    • 要找出线条角度的差异,您可以简单地找出每条线条的角度 (arctan((x_1-x_2)/(y_1-y_2))) 并减去它们。
    • 要计算线的平均距离,您可以简单地使用每条线的第一个点和每条线的第二个点的距离公式,然后将这些距离平均在一起。

    除此之外(除非你的线条是 3D 的),没有其他东西可以真正“比较”它们。

    也许我理解错了。您是否要比较行的字符串值?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      相关资源
      最近更新 更多