geolife笔记:比较不同轨迹相似度方法

1 问题描述

在geolife 笔记:将所有轨迹放入一个DataFrame-CSDN博客中,已经将所有的轨迹放入一个DataFrame中了,我们现在需要比较,在不同的轨迹距离度量方法下,轨迹相似度的效果。

这里采用论文笔记:Deep Representation Learning for Trajectory Similarity Computation-CSDN博客中的方法:

2 收集每一个id对应的轨迹

2.1 经纬度转化成墨卡托坐标系

2.1.1 相关坐标系转换函数

def lonlat_to_Mercator_(lon,lon_y):
    x=lon*20037508.34/180
    y=math.log(math.tan((90 + lon_y) * math.pi / 360)) / (math.pi / 180)
    y=y*20037508.34/180    
    return x,y


def Webmercater2latlon(mer_x,mer_y):
    lon_x=mer_x/20037508.34*180
    lon_y=mer_y/20037508.34*180
    
    lon_y=180/math.pi*(2*math.atan(math.exp(lon_y*math.pi/180))-math.pi/2)
    
    return(lon_x,lon_y)

2.1.2 将traj中的经纬度转换

import math
traj['mer_x'],traj['mer_y']=zip(*traj.apply(lambda row:lonlat_to_Mercator_(row['Longitude'],row['Latitude']),axis=1))
traj

2.2 收集每个用户的轨迹,并且分成Qa和Qb

 2.2.1 轨迹数量(id数量)计数

iid=traj['id'].unique()
iid
'''
array(['5_0_0', '5_0_1', '6_0_0', ..., '18669_0_0', '18669_0_1',
       '18669_1_0'], dtype=object)
'''

len(iid)
#26506

2.2.2 每一个id的轨迹是一个二维数组

usr_lst_a=[]
usr_lst_b=[]

for i in range(len(iid)):
    print(str(i)+'/26506')
    tmp=traj[traj['id']==iid[i]]

            
    usr_lst_a.append(tmp.iloc[0::2][['mer_x','mer_y']].values.tolist())
    usr_lst_b.append(tmp.iloc[1::2][['mer_x','mer_y']].values.tolist())

2.2.3 【番外篇】如何保存这样的一个usr_lst_a

使用pickle即可保存

import pickle

file=open('usr_lst_a.pkl', 'wb')
# 打开一个文件用于写入
    
pickle.dump(usr_lst_a, file)
# 使用 pickle 将列表保存到文件

加载也是用pickle即可

 

import pickle

file=open('usr_lst_a.pkl', 'rb')
# 打开包含列表的文件

    
usr_lst_a_loaded = pickle.load(file)
# 从文件中加载列表

# 现在 usr_lst_a_loaded 包含了原始列表的内容

3 获取 query和db的轨迹

3.1 获取 query的index

这里我们假设取100条query轨迹

import numpy as np

query_index=np.random.choice(range(26506),100,replace=False)
query_index

3.2 获取db的index

db中不能有query中相同的index,需要将其去掉

remaining_index=np.setdiff1d(range(26506),query_index)
#剥离掉query_index中出现过的index

db_index_200=np.random.choice(remaining_index,200,replace=False)
#不放回地取200条db轨迹

3.3 获得index对应的query和db

#query是usr_lst_a的轨迹
#db是usr_lst_b的轨迹

query_a=[np.array(usr_lst_a[i]) for i in query_index]
# query的轨迹


db_200=[np.array(usr_lst_b[i]) for i in query_index]
#前面图中的D'Q部分


tmp=[np.array(usr_lst_b[i]) for i in db_index_200]
#前面图中的D'P部分

db_200.extend(tmp)
len(db_200)
#300
#合并D'Q 和D'P

4 进行不同轨迹距离metric的比较

这里我们使用traj_dist 笔记:测量轨迹距离-CSDN博客

 4.1 DTW

4.1.1 计算距离    

matrix=tdist.cdist(query_a,db_200,metric='dtw')
matrix.shape
#(100, 300)

matrix
'''
array([[3.99011261e+03, 1.26255574e+05, 1.66553907e+06, ...,
        8.98934874e+05, 7.84387213e+05, 5.95675251e+05],
       [1.28147933e+05, 9.01677894e+02, 1.55506527e+06, ...,
        1.03084098e+06, 6.73764954e+05, 1.83283089e+05],
       [1.67968070e+06, 1.56695085e+06, 5.33874317e+03, ...,
        3.50815209e+06, 1.65426137e+06, 1.38635168e+06],
       ...,
       [3.01319981e+05, 1.77685546e+05, 1.27850210e+06, ...,
        1.62103431e+06, 7.59119890e+05, 1.09910254e+06],
       [5.33804206e+05, 3.42443346e+05, 2.76131608e+06, ...,
        7.79191042e+05, 7.07501918e+05, 3.45680219e+05],
       [6.03068982e+05, 1.00838365e+06, 2.75499248e+06, ...,
        9.87143735e+05, 1.53889762e+06, 2.25913510e+06]])
'''


# 距离矩阵排序
sort_index=np.argsort(matrix)
sort_index
'''
array([[  0, 121, 225, ..., 135,  47, 201],
       [  1,  21, 124, ...,  47, 201, 271],
       [  2, 241, 111, ...,  29, 226, 271],
       ...,
       [ 97, 110, 240, ...,  60, 135, 271],
       [ 98, 284,  26, ...,  29,  81, 170],
       [ 99, 239,  27, ...,  47, 201, 170]])
'''

 4.1.2 计算hit rate

即hit rate @1,有多少的top-1轨迹正好是对应的Ta‘

num=0
for i in range(100):
    if(i in sort_index[i][:1]):
        num+=1
num/100
#0.97

   4.1.3 计算 mean rank

每一条轨迹的平均rank

num=0
for i in range(len(sort_index)):
    tmp=sort_index[i].tolist()
    #每一个T'a对应的rank
    num+=tmp.index(i)
num/100+1
#这里+1的原因是,index是从0开始计数的,rank则是从1开始的
#1.03

4.2 其他

其他的也是类似的

#EDR
matrix_edr=tdist.cdist(query_a,db_200,metric='edr',eps=1000)


#ERP
matrix_erp=tdist.cdist(query_a,db_200,metric='erp',g=g)


#LCSS
matrix_lcss=tdist.cdist(query_a,db_200,metric='lcss',eps=1000)


#hausdorff
matrix_hau=tdist.cdist(query_a,db_200,metric='hausdorff')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/238592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前沿技术|张磊:RR22 Blazing Fast PSI 实现介绍

“隐语”是开源的可信隐私计算框架,内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择,提供丰富的联邦学习算法和差分隐私机制 开源项目 github.com/secretflow gitee.com/secretflow ​ 11月25日,「隐语开源社区 Meetup西安站」顺利举…

Pika:AIGC新秀,视频生成产业或迎来GPT时刻

今天分享的AIGC系列深度研究报告:《Pika:AIGC新秀,视频生成产业或迎来GPT时刻》。 (报告出品方:中泰证券) 报告共计:11页 Pika:专注Text to Video生成场景,支持3D和动漫…

从视频中提取图片,轻松制作专属视频封面

你是否曾经为如何制作一个吸引人的视频封面而烦恼?现在,我们将向你展示如何从视频中提取图片,并轻松制作专属的视频封面。无论你是视频编辑新手,还是经验丰富的专业人士,这个技巧都能够帮助你快速提升你的视频品质。 …

时间戳与QDateTime转换,以及QString转时间戳

1、主要有时间戳->QDateTime,QDateTime->QString 2、同时QString->QDateTime,QDateTime->时间戳 详情见代码&#xff1a; //QDateTime转时间戳qint64 time QDateTime::currentSecsSinceEpoch();double nowTime (double)time;qDebug()<<"nowTime1111…

【VTK】VTK中的光标样式

很高兴在雪易的CSDN遇见你 前言 本文分享VTK中的光标设置相关内容技术&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点赞就是我的动力(&#xff3e;&#xff35;&#…

你知道如何画时间轴吗?

时间轴的英文是time axis。贯穿四维空间的一条线&#xff0c;是虚数轴&#xff0c;时间轴上一段距离表示时间 。&#xff08;源自“百度百科”&#xff09; 时间轴&#xff1a;通过互联网技术&#xff0c;依据时间顺序&#xff0c;把一方面或多方面的事件串联起来&#xff0c;…

12.11作业

1. 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…

java面试题-mysql索引相关问题

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 这一块本想着晚一点再整…

大型软件编程实际应用实例:个体诊所电子处方系统,使用配方模板功能输入症状就可开出处方软件操作教程

一、前言&#xff1a; 在开电子处方的时候&#xff0c;如果能够输入症状就可以一键导入配方&#xff0c;则在很大程度上可以节省很多时间。而且这个配方可以根据自己的经验自己设置&#xff0c;下面以 佳易王诊所电子处方软件为例说明。 二、具体一键导入配方详细操作教程 点击…

Linux本地部署Mosquitto MQTT协议消息服务端并实现远程访问【内网穿透】

文章目录 前言1. Linux 搭建 Mosquitto2. Linux 安装Cpolar3. 创建MQTT服务公网连接地址4. 客户端远程连接MQTT服务5. 代码调用MQTT服务6. 固定连接TCP公网地址7. 固定地址连接测试 前言 Mosquitto是一个开源的消息代理&#xff0c;它实现了MQTT协议版本3.1和3.1.1。它可以在不…

牛客周赛 Round 22(C、D题解)

C、小红的数组构造&#xff08;思维&#xff09; 一、题目要求 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小红想让你构造一个长度为 n 的数组&#xff0c;满足以下三个条件&#xff1a; 1. 该数组最大值不超过 k。 2. 该数…

adb命令学习记录

1、 adb ( android debug bridge)安卓调试桥&#xff0c;用于完成电脑和手机之间的通信控制。 xcode来完成对于ios设备的操控&#xff0c;前提是有个mac电脑。 安卓系统是基于linux内核来进行开发的。 2、adb的安装: 本身 adb是 android SDK 其中自带的工具&#xff0c;用于完…

项目必备手册-项目计划书

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件全资料获取&#xff1a;点我获取

充分发挥SQL能力之数列

SQL数列 1、数列概述2、SQL数列2.1、简单递增序列2.2、等差数列2.3、等比数列3、SQL数列的应用3.1、连续问题3.2、多维分析1、数列概述 数列是最常见的数据形式之一,实际数据开发场景中遇到的基本都是有限数列。常见的数列例如:简单递增序列、等差数列、等比数列等 如何充分…

(新手必看)自定义数据传输通信协议+STM32代码详解

前言 本篇博客主要学习和了解一些单片机协议的格式&#xff0c;在对传输大数据或者要求准确性的时候&#xff0c;都需要通过协议来发送接收&#xff0c;下面通过了解协议的基本构成和代码来分析和实现协议的发送和接收。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联…

yolov8 onnx推理

前言&#xff1a;yolov8的后处理在某些情况下会导致转模型失败&#xff0c;因此需要把后处理剥离出来。 代码需要做如下修改&#xff1a; 改完后&#xff0c;网络会有三个输出&#xff0c;如图&#xff1a; 最后&#xff0c;用python写网络的后处理&#xff1a; import onn…

用心研发好产品:健康品牌podeey是如何做到的?

在分析消费者健康需求的同时&#xff0c;美国podeey能量生命有限公司&#xff08;PODEEY Biotechnology LLC.&#xff09;不断提升自主研发实力&#xff0c;并且一直注重汇集全球前沿的研发力量&#xff0c;与贵州宏臻菌业达成战略合作&#xff0c;始终致力于以科学技术为核心&…

软件测试HR总结的软件测试常见面试题

一、测试流程是什么样的&#xff1f; 1.产品确定需求后&#xff0c;邀请项目经理&#xff0c;开发&#xff0c;测试等人员参加需求评审会&#xff1b; 2.评审结束后开发根据需求文档和接口文档开发&#xff0c;测试制定测试计划和编写手工测试用例&#xff0c;测试脑图&#xf…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)

在文章【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手中我们介绍了Redis常用的10大数据类型&#xff0c;这10大数据类型可并不是直接在底层通过代码实现的&#xff0c;而是通过不同的底层数据结构组合起来的&#xff0c;这篇我们介绍下Redis常用数据类型…

【LeetCode】每日一题 2023_12_12 下一个更大元素 IV(堆,优先级队列/单调栈)

文章目录 刷题前唠嗑题目&#xff1a;下一个更大元素 IV题目描述代码与解题思路 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 时隔两天&#xff0c;LeetCode 每日一题重新开张&#xff0c;流感已经不能阻挡我的脚步了&#xff01; 题目&#x…
最新文章