1 算法介绍
- 给定两个长度分别为n和m的轨迹tr1和tr2,最小距离的匹配阈值e
- 两条轨迹之间的EDR距离就是需要对轨迹tr1进行插入、删除或替换使其变为tr2的操作次数
- 动态规划的算法如下
红色的是还没有考虑的两个轨迹部分;黑色是已经考虑过的两个轨迹部分
2 举例
- 在p1处“插入”一点、将p2'“替换”替换为p3和在p5处“插入”一点,共计3个操作使两条轨迹相等(即对应点距离均小于阈值),故其EDR值为3
3 python代码
3.1 自行实现
import numpy as np
def EDR(TR1,TR2):
m,n = len(TR1)+1,len(TR2)+1
matrix = np.zeros((m,n))
#matrix[i][j]表示 TR1还剩i个元素,TR2还剩j个元素时,他们的编辑距离
for i in range(1,m):
matrix[i][0] = i
for j in range(1,n):
matrix[0][j] = j
#这两个for循环表示,一个轨迹没有元素了,另一个轨迹还有n个元素,那么此时编辑距离为n(插入/删除n个值
for i in range(1,m):
for j in range(1,n):
if TR1[i-1]==TR2[j-1]:
cost = 0
else:
cost = 1
#判断两个轨迹对应位置的值是否一致
matrix[i][j]=min(matrix[i-1][j]+1,matrix[i][j-1]+1,matrix[i-1][j-1]+cost)
#删除,插入,替换,这三个操作哪个编辑距离小一点,就选哪个
return matrix
disEDR=EDR("ivan1","ivan2")
disEDR[-1][-1],disEDR
'''
(1.0,
array([[0., 1., 2., 3., 4., 5.],
[1., 0., 1., 2., 3., 4.],
[2., 1., 0., 1., 2., 3.],
[3., 2., 1., 0., 1., 2.],
[4., 3., 2., 1., 0., 1.],
[5., 4., 3., 2., 1., 1.]]))
'''
3.2 editdistpy包
EDR的快速实现
import sys
from editdistpy import levenshtein
string_1 = "ivan1"
string_2 = "ivan2"
levenshtein.distance(string_1, string_2,sys.maxsize)
#1
levenshtein.distance(string_1, string_2,0.5)
#-1
如果编辑距离小于第三个变量,那么就返回编辑距离,否则返回-1
参考内容: