Frechet Distance
- 它是计算两曲线距离的算法,用来判断两曲线的相似度,计算结果越小说明相似度越高
基于python实现该算法
需要下载numpy包,向量库
import math
import numpy as np
# 这个方法是计算两点的距离公式
def euc_dist(pt1, pt2):
return math.sqrt((pt2[0]-pt1[0])*(pt2[0]-pt1[0])+(pt2[1]-pt1[1])*(pt2[1]-pt1[1]))
# 这个就是计算Frechet Distance距离的具体过程,是用递归方式计算
def _c(ca,i,j,P,Q):
if ca[i,j] > -1:
return ca[i,j]
elif i == 0 and j == 0:
ca[i,j] = euc_dist(P[0],Q[0])
elif i > 0 and j == 0:
ca[i,j] = max(_c(ca,i-1,0,P,Q),euc_dist(P[i],Q[0]))
elif i == 0 and j > 0:
ca[i,j] = max(_c(ca,0,j-1,P,Q),euc_dist(P[0],Q[j]))
elif i > 0 and j > 0:
ca[i,j] = max(min(_c(ca,i-1,j,P,Q),_c(ca,i-1,j-1,P,Q),_c(ca,i,j-1,P,Q)),euc_dist(P[i],Q[j]))
else:
ca[i,j] = float("inf")
return ca[i,j]
# 这个是给我们调用的方法
def frechet_distance(P,Q):
ca = np.ones((len(P),len(Q)))
ca = np.multiply(ca,-1)
return _c(ca, len(P) - 1, len(Q) - 1, P, Q) # ca是a*b的矩阵(3*4),2,3
curve_a = [(1,2),(2,4)] # 这个是曲线1
curve_b = [(1,4),(2,8),(3,4)] # 这个是曲线2
result = frechet_distance(curve_a,curve_b)
print(result) # 打印结果
大致解释下代码
- ca是一个矩阵,是n*m的矩阵,这里n和m是曲线1和2的集合长度,即曲线上点的个数。用于存放所有的计算结果。
- 整体计算是这样:调用方法是传入的是两条曲线最后一个点的下标,然后递归调用,返回条件是一直从最后一个点的下标计算到【0】也就是第一个点。
计算结果
- 如果曲线P和曲线Q都是4个点,那么结果集就是P和Q从第一个点到最后一个点,每个点都计算其距离,其中最大的就是Frechet Distance距离
- 如果曲线P是4个点,曲线Q是6个点,那么结果集是P和Q对应位置的点的距离以及P的第四个点和Q的第5和第6个点距离,其中最大的是Frechet Distance距离