弗雷歇距离的原理及python代码实现(动态规划)

在网上看了很多关于弗雷歇距离的介绍,结合自己的理解,出一版更通俗易懂、更清晰具体的解释。

最简单的解释自然是最短狗绳长度,但我将从另一个角度来解释它。

图中人牵着狗在走,人走直线,狗走得自由且散漫。为了能拴住狗,任何时刻狗绳的长度都应该大于人狗距离,于是有最短狗绳长度等于最大人狗距离。

现在我们假定人只能走蓝色轨道,狗只能走红色轨道且都只能向前走,但是具体怎么走——中途停不停、走多快是未知的,然后我们对时间进行采样,将得到人、狗轨迹的离散序列,计算两序列中对应离散点的距离,距离的最大值即这一次遛狗所需的最短狗绳长度。

基于这个理解,上图显示的便是一次遛狗所得到的人、狗轨迹离散序列,虚线连接了两序列中对应的离散点,最大虚线长度便是这次遛狗所需的最短狗绳长度。下一次遛狗得到的离散序列可能就大不相同,例如,人走到中间时,狗已经走到红色轨道的终点并在那等着主人,那么这一次遛狗所需的最短狗绳长度就大于上一次的。在无数次遛狗中,最短狗绳长度的最小值就是弗雷歇距离!

注:对于两条连续轨迹,不可能遍历所有人狗轨迹离散序列,因此只能求下界,对于两条离散轨迹,取最小值即可。

动态规划计算弗雷歇距离:

设甲、乙两人的离散轨迹序列分别为Ta、Tb,Ta、Tb的长度分别为M、N,两轨迹之间的弗雷歇距离为Fd[M][N]。假设Ta、Tb的最后一个点分别是A、B,那么可以有三种行走情形:

  1. 甲、乙两人都在最后时刻到达终点A、B,那么此时Fd[M][N] = max(Fd[M-1][N-1], d(A,B))
  2. 甲先到达终点A并在那等着乙到达终点B,那么此时Fd[M][N] = max(Fd[M][N-1], d(A,B))
  3. 乙先到达终点B并在那等着甲到达终点A,那么此时Fd[M][N] = max(Fd[M-1][N], d(A,B))

由此我们可以得到传递函数:
Fd[i][j]={d(Ta[i],Tb[j])i=j=1max(Fd[i][j−1],d(Ta[i],Tb[j]))i=1,j>1max(Fd[i−1][j],d(Ta[i],Tb[j]))i>1,j=1max(min(Fd[i−1][j−1],Fd[i−1][j],Fd[i][j−1]),d(Ta[i],Tb[j]))i>1,j>1Fd[i][j]=\left\{ \begin{array}{lcl} d(Ta[i],Tb[j]) & & {i=j=1}\\ max(Fd[i][j-1],d(Ta[i],Tb[j])) & & {i=1, j>1}\\ max(Fd[i-1][j],d(Ta[i],Tb[j])) & & {i>1, j=1}\\ max(min(Fd[i-1][j-1],Fd[i-1][j],Fd[i][j-1]),d(Ta[i],Tb[j])) & & {i>1, j>1}\\ \end{array} \right. Fd[i][j]=⎩⎪⎪⎨⎪⎪⎧​d(Ta[i],Tb[j])max(Fd[i][j−1],d(Ta[i],Tb[j]))max(Fd[i−1][j],d(Ta[i],Tb[j]))max(min(Fd[i−1][j−1],Fd[i−1][j],Fd[i][j−1]),d(Ta[i],Tb[j]))​​i=j=1i=1,j>1i>1,j=1i>1,j>1​

min(max(Fd[i−1][j−1],d(Ta[i],Tb[j])),max(Fd[i−1][j],d(Ta[i],Tb[j])),max(Fd[i][j−1],d(Ta[i],Tb[j])))=max(min(Fd[i−1][j−1],Fd[i−1][j],Fd[i][j−1]),d(Ta[i],Tb[j]))\begin{array}{lcl} min(max(Fd[i-1][j-1],d(Ta[i],Tb[j])), max(Fd[i-1][j],d(Ta[i],Tb[j])),max(Fd[i][j-1],d(Ta[i],Tb[j])))\\=max(min(Fd[i-1][j-1],Fd[i-1][j],Fd[i][j-1]),d(Ta[i],Tb[j])) \end{array} min(max(Fd[i−1][j−1],d(Ta[i],Tb[j])),max(Fd[i−1][j],d(Ta[i],Tb[j])),max(Fd[i][j−1],d(Ta[i],Tb[j])))=max(min(Fd[i−1][j−1],Fd[i−1][j],Fd[i][j−1]),d(Ta[i],Tb[j]))​

python代码实现(https://blog.csdn.net/qq_42517334/article/details/103506868):

import math
import numpy as npdef calculate_euclid(point_a, point_b):"""Args:point_a: a data point of curve_apoint_b: a data point of curve_bReturn:The Euclid distance between point_a and point_b"""return math.sqrt((point_a - point_b) ** 2)def calculate_frechet_distance(dp, i, j, curve_a, curve_b):"""Args:dp: The distance matrixi: The index of curve_aj: The index of curve_bcurve_a: The data sequence of curve_acurve_b: The data sequence of curve_bReturn:The frechet distance between curve_a[i] and curve_b[j]"""if dp[i][j] > -1:return dp[i][j]elif i == 0 and j == 0:dp[i][j] = calculate_euclid(curve_a[0], curve_b[0])elif i > 0 and j == 0:dp[i][j] = max(calculate_frechet_distance(dp, i - 1, 0, curve_a, curve_b),calculate_euclid(curve_a[i], curve_b[0]))elif i == 0 and j > 0:dp[i][j] = max(calculate_frechet_distance(dp, 0, j - 1, curve_a, curve_b),calculate_euclid(curve_a[0], curve_b[j]))elif i > 0 and j > 0:dp[i][j] = max(min(calculate_frechet_distance(dp, i - 1, j, curve_a, curve_b),calculate_frechet_distance(dp, i - 1, j - 1, curve_a, curve_b),calculate_frechet_distance(dp, i, j - 1, curve_a, curve_b)),calculate_euclid(curve_a[i], curve_b[j]))else:dp[i][j] = float("inf")return dp[i][j]def get_similarity(curve_a, curve_b):dp = [[-1 for _ in range(len(curve_b))] for _ in range(len(curve_a))]similarity = calculate_frechet_distance(dp, len(curve_a) - 1, len(curve_b) - 1, curve_a, curve_b)# return max(np.array(dp).reshape(-1, 1))[0]return similarityif __name__ == '__main__':Ta = [1, 2, 3, 4]Tb = [7, 8, 9]print(get_similarity(Ta, Tb))

Reference:

数学定义

代码来源

弗雷歇距离的原理及python代码实现(动态规划)相关推荐

  1. 用弗雷歇距离(Fréchet Distance)进行音质和视质度量

    用弗雷歇距离(Fréchet Distance)进行音质和视质度量 当你能够衡量自己所说的东西,并用数字来说明它,这意味着你对它有较好的了解:反之,则意味你对它并不是真正了解. ----William ...

  2. 随机森林分类算法python代码_随机森林的原理及Python代码实现

    原标题:随机森林的原理及Python代码实现 最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好.因此想琢磨琢磨这个 ...

  3. CRC爆破png图片宽度和高度原理以及python代码

    CRC爆破png图片宽度和高度原理以及python代码 文章目录 CRC爆破png图片宽度和高度原理以及python代码 1.PNG图片的格式 2.CRC 3.Python爆破图片宽度和高度 参考文章 ...

  4. Fréchet distance(弗雷歇距离)-用于地图匹配

    Fréchet distance(弗雷歇距离)是法国数学家Maurice René Fréchet在1906年提出的一种路径空间相似形描述( 此外还在这篇论文里定义了 度量空间),这种描述同时还考虑进 ...

  5. 模式识别中利用二型势函数法求解非线性分类器的原理以及python代码实现

    前言 在学校的深度学习实验过程中,由于要求实现非线性分类器的势函数实验中给出的例程代码是matlab语言的(ps:自从电脑被偷了以后,新电脑没有装matlab),我便想到用python实现非线性分类器 ...

  6. 数据挖掘中的12种距离度量原理及实现代码

    本文介绍了12种常用的距离度量原理.优缺点.应用场景,以及基于Numpy和Scipy的Python实现代码. 笔记工具:Notability 文章目录 1. 个人笔记 2. 代码实现 1)闵可夫斯基距 ...

  7. catboost原理以及Python代码

    原论文: http://learningsys.org/nips17/assets/papers/paper_11.pdf catboost****原理: One-hot编码可以在预处理阶段或在训练期 ...

  8. python原理及代码_lightgbm原理以及Python代码

    原论文: lightgbm原理: gbdt困点: gbdt是受欢迎的机器学习算法,当特征维度很高或数据量很大时,有效性和可拓展性没法满足.lightgbm提出GOSS(Gradient-based O ...

  9. 深入浅出通信原理(Python代码版)

    深入浅出通信原理Python代码版 深入浅出通信原理是陈爱军的心血之作,于通信人家园连载,此处仅作python代码笔记训练所用 陈老师的连载从多项式乘法讲起,一步一步引出卷积.傅立叶级数展开.旋转向量 ...

最新文章

  1. DIV CSS display (block none inline)属性的用法教程
  2. 【知识星球】数据集板块重磅发布,海量数据集介绍与下载
  3. mysql下 ect p_Linux系统下启动MySQL的命令及相关知识
  4. .Oracle管理及常用基础脚本
  5. php mysql ajax 注册验证 实例_Ajax小实例   用户注册异步验证
  6. asp.net 添加成功弹出个div提示_IOS12免越狱一键修改微信提示音
  7. Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是......
  8. 购物车项目 复杂版本.待简化
  9. java证书不见了_java – 找不到证书链
  10. html同时用多个css,多类选择器的运用_html/css_WEB-ITnose
  11. 宏基aspire拆机触摸_(图) 宏基 Acer 4741G 完全拆解
  12. VectorDraw Web JS 9.9 Crack
  13. 手机浏览器打开微信小程序,支持外部浏览器跳转到小程序
  14. 定时器/计数器、中断
  15. Tapd+腾讯工蜂+Jenkins持续部署
  16. 浏览器指纹:原来我们一直被互联网巨头监视,隐私在网上裸奔、无处可藏
  17. MySQL数据库基础表格——增删改查(下)
  18. Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存和限速功能开发
  19. 遇见错误:ValueError: Classification metrics can‘t handle a mix of binary and continuous targets
  20. 使用Canvas实现网页鼠标签名效果

热门文章

  1. 写着代码的插画师—王凌 |WLOP|
  2. FireFoxOS 初体验
  3. Kubeadm手动更新证书
  4. 《旅行青蛙》的代码揭秘,攻略,体验
  5. 数字IC笔试题,大疆校招16题(仅供参考)
  6. 如何在 R 中执行 Wald 测试
  7. 编写一程序,将两个字符串连接起来,结果取代第一个字符串。(三种方法)
  8. 如何用云服务器进行深度学习
  9. 在电脑中如何调整PDF文件大小
  10. vb酒店管理信息系统