我一直在尝试修改Levenshtein距离函数,以便它可以找到两条线之间的距离,或xy坐标的集合(换句话说,线条的相似或不同,而不是它们的几何距离) 。我遇到了一些问题。我得到你如何获取上面的值来获得删除成本,以及左边的那个获得添加,但是在替换期间我试图使用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
答案 0 :(得分: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距离,你应该用简单的相等比较(a[0]==b[0] && a[1]==b[1]
)替换你的euclidianDistance()。
然后levenshtein算法会给你一个“编辑距离”。
答案 1 :(得分:0)
使用几何计算两条线之间的距离会不会更聪明? 或者是否有特定原因你不想使用它。
由于两条线总是有一个交点,除非它们是平行的(编辑,谢谢),所以很容易计算出最小距离:那是0或插入一些数学,这可以可以在谷歌上找到!
答案 2 :(得分:0)
我不明白为什么你会使用Levenshtein,似乎你会从简单的计算中得到更好的结果。
除此之外(除非你的线是3D),没有什么可以真正“比较”它们。
也许我误会了。您是否希望比较线的字符串值?