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

news2024/11/24 7:06:52

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.coloradmin.cn/o/1317404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

arthas 线上排查问题基本使用

一、下载 [arthas下载地址]: 下载完成 解压即可使用 二、启动 java -Dfile.encodingUTF-8 -jar arthas-boot.jar 如果直接使用java -jar启动 可能会出现乱码 三、使用 启动成功之后 arthas会自动扫描当前服务器上的jvm进程 选择需要挂载的jvm进程 假如需要挂在坐标【1】的…

【MySQL】(DDL) 数据类型 和 表操作-修改 删除

目录 介绍: 1.数值类型 3.日期类型 修改表: 示列: 介绍: 在之前建表语句内,用到了 int cvarchar ,那么在mysql内除了 以上的数据类型 还有那些常见数据类型 mysql 中的数据类型有很多种 &#xff0c…

机器学习 | 决策树 Decision Tree

—— 分而治之,逐个击破 把特征空间划分区域 每个区域拟合简单模型 分级分类决策 1、核心思想和原理 举例: 特征选择、节点分类、阈值确定 2、信息嫡 熵本身代表不确定性,是不确定性的一种度量。 熵越大,不确定性越高,…

maui中实现加载更多 RefreshView跟ListView 跳转到详情页 传参(3)

效果如图 这里的很多数据是通过传参过来的的。 代码 例表页加入跳转功能&#xff1a; <ListView ItemsSource"{Binding Items}" ItemAppearing"OnItemAppearing" ItemTapped"OnItemTapped" RowHeight"70" Margin"20"…

【C++11特性篇】一文助小白轻松理解 C++中的【左值&左值引用】【右值&右值引用】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.【左值&#xff06;左值引用】&…

【漏洞复现】CVE-2023-36076:smanga漫画阅读系统 远程命令执行 漏洞复现 附POC 附SQL注入和任意文件读取

漏洞描述 无需配置,docker直装的漫画流媒体阅读工具。以emby plex为灵感,为解决漫画阅读需求而开发的漫画阅读器。在windows环境部署smanga安装环境面板,首先安装小皮面板,下载smanga项目,导入数据库,登录smanga,windows部署smanga。 /php/manga/delete.php接口处存在未…

arthas获取spring bean

参考文章 arthas获取spring bean 写一个工具Util package com.example.lredisson.util;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import o…

工具在手,创作无忧:一键下载安装Auto CAD工具,让艺术创作更加轻松愉悦!

不要再浪费时间在网上寻找Auto CAD的安装包了&#xff01;因为你所需的一切都可以在这里找到&#xff01;作为全球领先的设计和绘图软件&#xff0c;Auto CAD为艺术家、设计师和工程师们提供了无限的创作潜力。不论是建筑设计、工业设计还是室内装饰&#xff0c;Auto CAD都能助…

ES-组合与聚合

ES组合查询 1 must 满足两个match才会被命中 GET /mergeindex/_search {"query": {"bool": {"must": [{"match": {"name": "liyong"}},{"match_phrase": {"desc": "liyong"}}]}}…

Next.js 学习笔记(一)——安装

安装 系统要求&#xff1a; Node.js 18.17 或更高版本支持 macOS、Windows&#xff08;包括 WSL&#xff09;和 Linux 自动安装 我们建议使用 create-next-app 启动一个新的 Next.js 应用程序&#xff0c;该应用程序会自动为你设置所有内容。要创建项目&#xff0c;请运行&…

HPV治疗期间如何预防重复感染?谭巍主任讲述具体方法

众所周知&#xff0c;人乳头瘤病毒(HPV)是一种常见的性传播疾病&#xff0c;感染后可能会引起生殖器疣、宫颈癌等疾病。在治疗期间&#xff0c;预防重复感染非常重要。今日将介绍一些预防HPV重复感染的方法。 1. 杜绝不洁性行为 在治疗期间&#xff0c;患者应该避免与感染HPV…

SQL、Jdbc、JdbcTemplate、Mybatics

数据库&#xff1a;查询&#xff08;show、select&#xff09;、创建&#xff08;create)、使用(use)、删除(drop)数据库 表&#xff1a;创建&#xff08;【字段】约束、数据类型&#xff09;、查询、修改&#xff08;alter *add&#xff09;、删除 DML&#xff1a;增加(inse…

R语言|分面中嵌入趋势线

简介 关于分面的推文&#xff0c;小编根据实际科研需求&#xff0c;已经分享了很多技巧。例如&#xff1a; 分面中添加不同表格 分面中添加不同的直线 基于分面的面积图绘制 分面中的细节调整汇总 基于分面的折线图绘制 最近科研中又遇到了与分面相关的需求&#xff1a;…

Java 第12章 异常 本章作业

1 编程 两数相除的异常处理 各自属于哪些异常&#xff1a; 数据格式不正确 NumberformatException 缺少命令行参数 ArrayIndexOutOfBoundsException 除0异常处理 ArithmeticException ArrayIndexOutOfBoundsException 为数组下标越界时会抛出的异常&#xff0c;可以在检测到命…

day20_22mysql数据库(简单了解)

为什么使用数据库 数据出存储在哪里&#xff1f; 硬盘&#xff0c;光盘&#xff0c;U盘&#xff0c;网盘&#xff0c;内存&#xff08;临时数据&#xff09; 为什么数据库 数据储存在哪里&#xff1f; 硬盘、网盘、U盘、光盘、内存&#xff08;临时存储&#xff09; 数据…

[密码学]AES

advanced encryption standard&#xff0c;又名rijndael密码&#xff0c;为两位比利时数学家的名字组合。 分组为128bit&#xff0c;密钥为128/192/256bit可选&#xff0c;对应加密轮数10/12/14轮。 基本操作为四种&#xff1a; 字节代换&#xff08;subBytes transformatio…

Python MySQL数据库连接与基本使用

一、应用场景 python项目连接MySQL数据库时&#xff0c;需要第三方库的支持。这篇文章使用的是PyMySQL库&#xff0c;适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 导入模块 import pymysql连接数据库 db pymysql.connect(hostlocalhost,usercode_space…

深入了解Linux网络配置:常见面试问题及解答

学习目标&#xff1a; 解释Linux网络配置的重要性和作用引入常见的面试问题 学习内容&#xff1a; 如何查看当前系统的IP地址和网关信息&#xff1f; 解答&#xff1a;可以使用ifconfig命令来查看当前系统的IP地址和网关信息。通过运行ifconfig命令&#xff0c;将会列出所有可…

【C++】STL 容器 - string 字符串操作 ⑤ ( string 字符串查找 | find 函数查找字符串 | rfind 函数查找字符串 )

文章目录 一、string 字符查找 - find 函数查找字符串1、string 类 find 函数原型说明2、代码示例 - 字符串查找3、代码示例 - 统计字符串子串 二、string 字符查找 - rfind 函数查找字符串1、string 类 rfind 函数原型说明2、代码示例 - rfind 字符串查找 一、string 字符查找…

如何查看PHP信息

创建一个 PHP 文件&#xff0c;比如 info.php&#xff0c;在其中添加以下代码&#xff1a; <?php phpinfo(); ?>访问这个文件&#xff08;例如&#xff0c;在浏览器中输入 http://localhost/info.php&#xff09;&#xff0c;它会显示 PHP 的所有配置信息。在这个页面…