Javascript 修改Levenshtein距离函数以计算两组x-y坐标之间的距离?

Javascript 修改Levenshtein距离函数以计算两组x-y坐标之间的距离?,javascript,distance,levenshtein-distance,Javascript,Distance,Levenshtein Distance,我一直在尝试修改Levenshtein距离函数,以便它可以找到两条直线之间的距离,或x-y坐标集(换句话说,直线之间的相似或不同程度,而不是它们的几何距离)。不过我遇到了一些问题。我知道你如何取上面的值来得到删除成本,左边的值来得到加法,但在替换过程中,我试图使用欧几里德距离,这对我不起作用 如果你能指出我做错了什么,那就太棒了 以下是javascript中的相关代码: padlock.dtw = { _deletionCost: 1, _insertionCost: 1,

我一直在尝试修改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]);
        }
    }
}

用几何计算两条直线之间的距离不是更聪明吗? 或者你不想使用它的具体原因是什么


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

我不明白你为什么要用Levenshtein来做这个,看来通过简单的计算你会得到更好的结果

  • 要找到直线角度的差异,只需找到每条直线的角度(arctan((x_1-x_2)/(y_1-y_2))并减去它们
  • 要求直线的平均距离,只需使用距离公式,将每条直线的第一个点和第二个点计算在一起,然后将这些距离平均
除此之外(除非你的线条是3D的),没有其他东西可以真正“比较”它们


也许我误解了。是否要比较直线的字符串值?

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

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

您有两组点,例如

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距离,应使用简单的相等比较(
a[0]==b[0]&&a[1]==b[1]
)替换欧几里得距离()


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

我希望你知道,当我说“距离”时,有更简单的方法“找到两条直线之间的距离,或一组x-y坐标”,我指的是两条直线之间有多相似或不同。我认为这是一个统计问题,而不是几何问题。顺便说一句,你可以使用毕达哥拉斯定理来计算两点之间的距离。你的意思是,除非它们是平行的。当我说“距离”时,我指的是两条线之间的相似或不同程度。请注意,提问者说的是两个“x-y坐标集”,而不仅仅是两个x-y坐标。你不能用任何精确的方式在两组点之间画一条线。问题是说“两条线之间的距离,或者x-y坐标集”,这些说法在一起毫无意义。
A = [ [1,1], [0,9], [3,3], [4,4] ]
B = [ [1,1], [2,2], [3,3], [4,4] ]