Я пытался работать над изменением функции расстояния Левенштейна, чтобы он мог найти расстояние между двумя линиями или наборы координат x-y (другими словами, как похожие или разные линии, а не их геометрическое расстояние). Однако я сталкиваюсь с некоторыми проблемами. Я получаю, как вы берете значение выше, чтобы получить стоимость удаления, а одно влево, чтобы получить добавление, но во время замены я пытаюсь использовать эвлидианское расстояние, и это не работает для меня.Изменение функции расстояния Левенштейна для вычисления расстояния между двумя наборами координат 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
Надеюсь, вы знаете, что есть более легкие способы «найти расстояние между двумя линиями или наборами координат xy». – spender
Когда я говорю «расстояние», я имею в виду больше среди строк того, как похожие или разные два линии. – HFLW
Я думаю, что это вопрос статистики, а не геометрии. – ironfroggy