曲线之间相似性的度量,它考虑了沿曲线的点的位置和顺序
数学笔记/scipy 笔记:豪斯多夫距离(Hausdorff )_UQI-LIUWJ的博客-CSDN博客
离散Fréchet距离是连续Fréchet距离的近似,当曲线所选取的离散点足够多时离散Fréchet距离近似等于连续Fréchet距离。
import numpy as np
a_array = np.array([2, 4, 6, 8])
b_array = np.array([2, 3, 4, 6, 5, 7, 8])
#距离函数
def euc_dist(pt1, pt2):
return np.sqrt(np.square(pt2[0] - pt1[0]) + np.square(pt2[1] - pt1[1]))
def _c(ca, i, j, P, Q):
if ca[i, j] > -1:
return ca[i, j]
#ca[i,j]之前计算过
elif i == 0 and j == 0:
ca[i, j] = euc_dist(P[0], Q[0])
#刚刚考虑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]))
# 刚刚考虑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]))
#刚刚考虑P序列的0和Q序列的j时
elif i > 0 and j > 0:
ca[i, j] = max(min(_c(ca, i - 1, j, P, Q), # P动Q不动
_c(ca, i - 1, j - 1, P, Q), # P不动Q动
_c(ca, i, j - 1, P, Q)), # 一起动
euc_dist(P[i], Q[j]))
#min是不考虑i,j时,至少需要多长的”狗绳“
#再取max表示考虑i,j时,需要多长的”狗绳“
else:
ca[i, j] = float("inf")
# 非法的无效数据,算法中不考虑,此时 i<0,j<0
return ca[i, j]
def frechet_distance(P, Q):
ca = np.ones((len(P), len(Q)))
ca = np.multiply(ca, -1)
# ca初始化成全-1的矩阵,shape = ( len(a), len(b) )
dis = _c(ca, len(P) - 1, len(Q) - 1, P, Q)
return dis
curve_line_a = list(zip(range(len(a_array)), a_array))
curve_line_b = list(zip(range(len(b_array)), b_array))
#给a,b添加x坐标
curve_line_a
#[(0, 2), (1, 4), (2, 6), (3, 8)]
frechet_distance(curve_line_a,curve_line_b)
#3.0
参考内容:
Frechet distance距离计算原理及python实现_frechet距离_spatial_coder的博客-CSDN博客
曲线相似度衡量——曲线距离计算Fréchet distance详解与python计算-物联沃-IOTWORD物联网
弗雷歇距离 matlab,离散Fréchet(弗雷歇) 距离评价曲线相似度_戴铂的博客-CSDN博客