编程语言
首页 > 编程语言> > javascript – 修改Levenshtein距离函数来计算两组x-y坐标之间的距离?

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

作者:互联网

我一直在尝试修改Levenshtein距离函数,以便它可以找到两条线或x-y坐标组之间的距离(换句话说,线条的相似或不同,而不是它们的几何距离).我遇到了一些问题.我得到你如何获取上面的值来获得删除成本,以及左边的那个获得添加,但在替换期间我试图使用euchlidian距离,并且它不适合我.

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

这是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

解决方法:

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

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

你有两组积分,例如

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距离是编辑距离,没有几何距离.您试图更改它,以便计算编辑和几何距离的混合.这种混合没有任何意义,它是无用的和错误的,恕我直言.

结论

要计算两组xy坐标的levenshtein距离,你应该用简单的等式比较替换你的euclidianDistance()(a [0] == b [0]& a amp; a [1] == b [1]) .

然后levenshtein算法将给你一个“编辑距离”.

标签:javascript,levenshtein-distance,distance
来源: https://codeday.me/bug/20190710/1423278.html