基于缓冲原理计算轨迹相似度

news/2025/3/15 11:54:03/

目录

  • 前言
  • 预备知识
  • 思路与核心代码
  • 优缺点分析
  • 数值实验
  • 参考文献

前言

接上文,我们已经知道如何利用夹角余弦来计算两条轨迹的相似度,也知道其中优势和劣势,夹角余弦方法作为一个基础的baseline有其存在的价值,很多学者也提出了各式各样的改进方法来计算轨迹相似度,但是,在上文,我们也提到了 在轨迹相似度计算的时候应该尽量使用与轨迹点直接关系的测度,如轨迹点的数目等,而不应该使用有轨迹点组合而成的几何对象,如线,面,多边形等 。 也就是回归事务数据本源,而不应该为了对比相似性而七拼八凑,这样反而回来带杂质,测度的不准。这一节,我们就来利用缓冲原理计算轨迹相似度。

预备知识

我们在GIS分析的时候,经常会对一个对象做缓冲来看其影响范围,而轨迹具有线性特质,现在,将如下轨迹L

L = [ p 1 , p 2 , ⋯ , p n ] L = [p_1,p_2, \cdots, p_n] L=[p1,p2,,pn]

其中, p i ( 1 ≤ i ≤ n ) p_i(1\leq i\leq n) pi1in表示第i个轨迹点的位置信息 p i = [ l n g i , l a t i ] p_i=[lng_i, lat_i] pi=[lngi,lati],改成集合形式

L = { p i ∣ 1 ≤ i ≤ n } L = \{p_i|1\leq i \leq n\} L={pi∣1in}

如果对 L L L进行一定范围 δ \delta δ 的缓冲的话会形成一条固定宽度的长带

L ^ = { s ∣ d ( s , L ) < δ } \hat{L} = \{ s|d(s,L)<\delta\} L^={sd(s,L)<δ}

有另一条轨迹 Q Q Q
Q = [ q 1 , q 2 , ⋯ , q n ] Q = [q_1,q_2, \cdots, q_n] Q=[q1,q2,,qn]
如果 Q Q Q有一些点有落在这个长带 L ^ \hat{L} L^范围里面,我们可以称 Q Q Q的这些点为 L L L这条轨迹可触达的点, Q Q Q L L L存在相似性,如果 Q Q Q没有轨迹点落在这个长带范围里面,则称 Q Q Q L L L不存在相似性。

思路与核心代码

既然两条轨迹的相似度与其可触达点有密切关系,那么,可以定义两条轨迹的相似度计算公式

S i m ( L , Q ) = λ 1 ∣ L Q ∣ ∣ L ∣ + λ 2 ∣ Q L ∣ ∣ Q ∣ Sim(L,Q) = \lambda_1 \frac{|L_Q|}{|L|} +\lambda_2 \frac{|Q_L|}{|Q|} Sim(L,Q)=λ1LLQ+λ2QQL

其中, L Q L_Q LQ表示轨迹 L L L被轨迹 Q Q Q缓冲出的可触达的点做成的集合, Q L Q_L QL表示轨迹 Q Q Q被轨迹 L L L缓冲出的可触达的点做成的集合, ∣ L ∣ |L| L表示轨迹 L L L的轨迹点的个数, ∣ Q ∣ |Q| Q表示轨迹 Q Q Q的轨迹点的个数, λ i \lambda_i λi表示各自对应可触达点的权重,可以是每条轨迹点的占所有轨迹点的比重;

def toleranceTest(traj1, traj2): #容差检测,检测两条轨迹的对应轨迹点的距离,并给出缓冲范围的建议值max_lng = np.max([traj1['lng'].max(), traj2['lng'].max()])min_lng = np.min([traj1['lng'].min(), traj2['lng'].min()])max_lat = np.max([traj1['lat'].max(), traj2['lat'].max()])min_lat = np.min([traj1['lat'].min(), traj2['lat'].min()])dot1 = [min_lng, min_lat]dot2 = [max_lng, min_lat]dot3 =  [max_lng,  max_lat]dot4  = [min_lng, max_lat]rectangle = Polygon([dot1, dot2, dot3, dot4])area = rectangle.area# print("所在区域范围面积", area)if  area< 0.00001:eps = 0.0001 #10米elif area<0.0001:eps = 0.0002 #20米elif area<0.001:eps = 0.0003 #30米elif area<0.01:eps = 0.0004 #40米elif area<0.1:eps = 0.0005 #50米elif area<1:eps = 0.001 #100米else:eps = 0.0015 #150米# print("缓冲宽度", eps)return epsdef bufferSimilarity(traj1, traj2, eps): #缓冲相似度traj1_points  = list(zip(traj1['lng'], traj1['lat']))traj2_points  = list(zip(traj2['lng'], traj2['lat']))traj1_line = LineString(traj1_points)traj2_line = LineString(traj2_points)traj1_buffer = traj1_line.buffer(eps) #缓冲50米traj2_buffer = traj2_line.buffer(eps) #缓冲50米traj1_buffer_cnt = 0 #轨迹1缓冲的点traj2_buffer_cnt = 0 #轨迹2缓冲的点数for point in traj2_points:if traj1_buffer.contains(Point(point)):  # True or Falsetraj1_buffer_cnt +=1for point in traj1_points:if traj2_buffer.contains(Point(point)):traj2_buffer_cnt +=1buffer_sim_value = (traj1_buffer_cnt/len(traj2_points)*(len(traj2_points)/(len(traj1_points)+len(traj2_points))))+\(traj2_buffer_cnt/len(traj1_points)*(len(traj1_points)/(len(traj1_points)+len(traj2_points))))print("缓冲相似度", buffer_sim_value)return buffer_sim_value

优缺点分析

考虑到轨迹跨度范围的不同,有些轨迹可能只有几公里,有些几十公里,有些却有上百公里,不同跨度所需要的缓冲宽度也是不一样的,为此,可以设计一个容差检测,其目的是为不同长度的轨迹对比提供一个缓冲宽度参考,直白一点的就是长的轨迹,缓冲宽一点,短的轨迹缓冲窄一点,这种映射关系可以设计成压缩映射,可以找轨迹范围四至的面积作为标的标的物比,具体见toleranceTest函数,主函数就是把两者相互缓冲对方的轨迹点计算出来,然后利用类似杰卡德公式来计算两条轨迹的相似度。

数值实验

下面是对不同运单利用缓冲原理计算出来的相似度对比,整体还不错,既考虑了相互对称性,有考虑各自轨迹点数的影响,具有很好的均衡性和稳健性。
缓冲相似度

参考文献

1,轨迹相似性度量方法
https://blog.csdn.net/weixin_39910711/article/details/109333641
2,【ST】轨迹相似性度量
https://zhuanlan.zhihu.com/p/384362352
3,轨迹相似性度量
https://zhuanlan.zhihu.com/p/148797145
4,向量相似度
https://blog.csdn.net/Gentleman_Qin/article/details/110465518
5,shapely官方文档
https://www.osgeo.cn/pygis/shapely.html
6,经纬度保留到不同小数位对应的精度
https://blog.csdn.net/qq_39805362/article/details/117329099


http://www.ppmy.cn/news/1082140.html

相关文章

华为云云服务器测评 | 云耀云服务器L实例教学(适合学生党的教程) —— 应用镜像WordPress使用教学(1)

一、引言 作为一名即将大三的学生&#xff0c;想要搭建一个个人博客网站&#xff0c;将自己的学习笔记以及成长经历记录下来&#xff0c;同时也是对自己的实际开发能力的考验。所以在华为云官网找到了一款轻量级云服务器——云耀云服务器L实例&#xff0c;大家可以点击下方连接…

【人工智能】—_神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

神经网络、前向传播、反向传播 文章目录 神经网络、前向传播、反向传播前向传播反向传播梯度下降局部最小值多层前馈网络表示能力多层前馈网络局限缓解过拟合的策略 前向传播是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后&#xff0c;最终得到输出结果的过…

Python学习教程:进程的调度

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 要想多个进程交替运行&#xff0c;操作系统必须对这些进程进行调度&#xff0c; 这个调度也不是随即进行的&#xff0c;而是需要遵循一定的法则&#xff0c;由此就有了进程的调度算法。 python更多源码/资料/解答/教程等 …

Java空指针异常

在所有的RuntimeException异常中&#xff0c;Java程序员最熟悉的恐怕就是NullPointerException了。 NullPointerException即空指针异常&#xff0c;俗称NPE。如果一个对象为null&#xff0c;调用其方法或访问其字段就会产生NullPointerException&#xff0c;这个异常通常是由J…

[dasctf]misc3 chrchrchr.pcapng

webshell 流量分析 php代码部分没啥看的&#xff0c;主要在标黄的部分&#xff0c;裁剪掉前面的字符可base解码 能看到在向a.txt中写入数据 wp # tshark.exe -r chrchrchr.pcapng -T fields -e urlencoded-form.value -Y "urlencoded-form.keyzd2ebbfb26dd" >…

uniapp小程序单页面改变手机电量,头部通知的颜色效果demo(整理)

onShow(){ // 改变电池的颜色 wx.setNavigationBarColor({ frontColor: ‘#ffffff’, //只支持两种颜色 backgroundColor: ‘#ffffff’, animation: { duration: 1 } }) }

报错处理:Out of memory

报错环境&#xff1a; Linux 具体报错&#xff1a; Out of memory error&#xff0c;系统内存不足 排错思路&#xff1a; 当系统的内存资源被耗尽时&#xff0c;会出现 Out of memory 错误。这可能是由于应用程序占用了大量的内存&#xff0c;或者系统负载过高导致内存不足引起…

从零学算法2833

2833.给你一个长度为 n 的字符串 moves &#xff0c;该字符串仅由字符 ‘L’、‘R’ 和 ‘’ 组成。字符串表示你在一条原点为 0 的数轴上的若干次移动。 你的初始位置就在原点&#xff08;0&#xff09;&#xff0c;第 i 次移动过程中&#xff0c;你可以根据对应字符选择移动方…