Fréchet distance(弗雷歇距离)是法国数学家Maurice René Fréchet在1906年提出的一种路径空间相似性计算方法。
直观的理解,Fréchet distance就是狗绳距离:主人走路径A,狗走路径B,他们行进的速度可能不同,但是不允许backtracking,各自走完这两条路径过程中所需要的最短狗绳长度。
Fréchet distance不仅考虑了曲线的空间位置,同时还考虑了曲线中形状点的顺序。
数学描述
给定Curve 1:
和Curve 2:
,Fréchet distance定义如下:
α是将[0,1]映射到[a,b]连续非降函数,β是将[0,1]映射到
连续非降函数。
实际计算中,用多边形曲线逼近连续曲线,转化为Discrete Frechet Distance。
假设多边形曲线为P,Q;
要计算P和Q的Fréchet distance,要先找到对应的点对序列
其中
,为了保证点的顺序,对于所有的i=1,...,q
,令
,然后计算对应点对的最大距离:
离散弗雷歇距离(Discrete Frechet Distance)的计算如下:
离散弗雷歇距离(Discrete Frechet Distance)算法
python实现
import numpy as np
def eucl_dist(x,y):
"""
Usage
-----
L2-norm between point x and y
Parameters
----------
param x : numpy_array
param y : numpy_array
Returns
-------
dist : float
L2-norm between x and y
"""
dist = np.linalg.norm(x-y)
return dist
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] = eucl_dist(P[0],Q[0])
elif i > 0 and j == 0:
ca[i,j] = max(_c(ca,i-1,0,P,Q),eucl_dist(P[i],Q[0]))
elif i == 0 and j > 0:
ca[i,j] = max(_c(ca,0,j-1,P,Q),eucl_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)),eucl_dist(P[i],Q[j]))
else:
ca[i,j] = float("inf")
return ca[i,j]
def discret_frechet(P,Q):
"""
Usage
-----
Compute the discret frechet distance between trajectories P and Q
Parameters
----------
param P : px2 numpy_array, Trajectory P
param Q : qx2 numpy_array, Trajectory Q
Returns
-------
frech : float, the discret frechet distance between trajectories P and Q
"""
ca = np.ones((len(P),len(Q)))
ca = np.multiply(ca,-1)
return _c(ca,len(P)-1,len(Q)-1,P,Q)