Javascript 修改Levenshtein距离函数以计算两组x-y坐标之间的距离?
我一直在尝试修改Levenshtein距离函数,以便它可以找到两条直线之间的距离,或x-y坐标集(换句话说,直线之间的相似或不同程度,而不是它们的几何距离)。不过我遇到了一些问题。我知道你如何取上面的值来得到删除成本,左边的值来得到加法,但在替换过程中,我试图使用欧几里德距离,这对我不起作用 如果你能指出我做错了什么,那就太棒了 以下是javascript中的相关代码:Javascript 修改Levenshtein距离函数以计算两组x-y坐标之间的距离?,javascript,distance,levenshtein-distance,Javascript,Distance,Levenshtein Distance,我一直在尝试修改Levenshtein距离函数,以便它可以找到两条直线之间的距离,或x-y坐标集(换句话说,直线之间的相似或不同程度,而不是它们的几何距离)。不过我遇到了一些问题。我知道你如何取上面的值来得到删除成本,左边的值来得到加法,但在替换过程中,我试图使用欧几里德距离,这对我不起作用 如果你能指出我做错了什么,那就太棒了 以下是javascript中的相关代码: padlock.dtw = { _deletionCost: 1, _insertionCost: 1,
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))并减去它们
- 要求直线的平均距离,只需使用距离公式,将每条直线的第一个点和第二个点计算在一起,然后将这些距离平均
也许我误解了。是否要比较直线的字符串值?如果我正确理解了您的问题,那么您应该完全删除用于计算两点之间欧几里德距离的代码 首先,让我重申你的问题: 您有两组点,例如
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] ]