前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Map Matching-轨迹相似性度量算法-Discrete Frechet Distance

Map Matching-轨迹相似性度量算法-Discrete Frechet Distance

作者头像
YoungTimes
发布2022-04-28 13:08:52
1.4K0
发布2022-04-28 13:08:52
举报
文章被收录于专栏:半杯茶的小酒杯

Fréchet distance(弗雷歇距离)是法国数学家Maurice René Fréchet在1906年提出的一种路径空间相似性计算方法。

直观的理解,Fréchet distance就是狗绳距离:主人走路径A,狗走路径B,他们行进的速度可能不同,但是不允许backtracking,各自走完这两条路径过程中所需要的最短狗绳长度

Fréchet distance不仅考虑了曲线的空间位置,同时还考虑了曲线中形状点的顺序。

数学描述

给定Curve 1:

和Curve 2:

,Fréchet distance定义如下:

Frechet Distance

α是将[0,1]映射到[a,b]连续非降函数,β是将[0,1]映射到

连续非降函数。

实际计算中,用多边形曲线逼近连续曲线,转化为Discrete Frechet Distance。

假设多边形曲线为P,Q;

要计算P和Q的Fréchet distance,要先找到对应的点对序列

其中

, 为了保证点的顺序,对于所有的

,令

然后计算对应点对的最大距离:

longest link

离散弗雷歇距离(Discrete Frechet Distance)的计算如下:

离散弗雷歇距离

离散弗雷歇距离(Discrete Frechet Distance)算法

Discrete Frechet Distance Algorithm

python实现
代码语言:javascript
复制
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)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 半杯茶的小酒杯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数学描述
  • 离散弗雷歇距离(Discrete Frechet Distance)算法
    • python实现
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档