Frechet Distance距离算法详解

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距离
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值