【车辆轨迹处理】python实现轨迹点的聚类(一)——DBSCAN算法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、单辆车轨迹的聚类与分析
- 1.引入库
- 2.聚类
- 3.聚类评价
- 二、整个数据集多辆车聚类
- 1.聚类
- 2.整体评价
前言
空间聚类是基于一定的相似性度量对空间大数据集进行分组的过程。空间聚类分析是一种无监督形式的机器学习。通过空间聚类可以从空间数据集中发现隐含的信息。
作者在科研工作中,需要对某些车辆的轨迹数据进行一些空间聚类分析,以期望发现车辆在行驶过程中发生轨迹点”聚集“的行为。当等时间间隔的轨迹点在某片区域分布过于”密“时,我们往往可以在这片区域发现某些信息,例如车辆在这片区域发生驻留或者低速行驶等。
在空间聚类算法中,DBSCAN是一种简单且有效的聚类算法,它有着基于密度、不需要预先指定聚类数、计算效率高的优点。
本文以如下格式车辆轨迹数据为例,实提供了DBSCAN对车辆轨迹数据聚类并分析的方法:
| collect_time | id | lon | lat |
|---|---|---|---|
| 时间 | 车辆标识 | 经度 | 纬度 |
为了尽量去除噪声影响,车辆轨迹数据已经经过滤波平滑,平滑方法可见作者之前文章:https://blog.csdn.net/jgsecurity/article/details/140608431。
一、单辆车轨迹的聚类与分析
对单辆车的轨迹数据,采用DBSCAN算法进行空间聚类。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种经典的密度聚类算法,适用于发现任意形状的聚类簇。其原理本文不做阐述,如有需要,可以自行搜索。
1.引入库
使用了数学计算库numpy和pandas,机器学习库scikit-learn,地理相关库shapely和geopy,绘图库matplotlib。
import numpy as np
import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn import metrics
from shapely.geometry import MultiPoint
from geopy.distance import great_circle
import matplotlib.pyplot as plt
2.聚类
在进行聚类之前,先使用shapely和geopy库实现了get_centermost_point函数。其输入数据cluster是列表类型,表示每一组聚类的点集。作用是在获得了每个聚类之后,计算出该聚类的中心点。
# 计算每个聚类的中心点
def get_centermost_point(cluster):# 计算整个点集合的质心点centroid = (MultiPoint(cluster).centroid.x, MultiPoint(cluster).centroid.y)# 取点集合中离质心点最近的点为中心点centermost_point = min(cluster, key=lambda point: great_circle(point, centroid).m)# 返回中心点return tuple(centermost_point)
对单辆车的聚类函数cluster_traj,其输入数据data是dataframe类型,表示一辆车的轨迹数据。
# DBSCAN聚类
def cluster_traj(data):# 提取dataframe中的经纬度列coords = data[['smoothed_lat', 'smoothed_lon']].values# 地球半径(km)kms_per_radian = 6371.0088# 定义epsilon为0.5(km),经纬度点间距离计算使用haversine公式# 由于haversine公式返回的距离是以弧度为单位,因此将距离阈值转换为弧度epsilon = 0.3 / kms_per_radian# 定义min_samples为6。epsilon和min_samples参数需要根据自己的数据调整。db = DBSCAN(eps=epsilon, min_samples=6, algorithm='ball_tree', metric='haversine').fit(np.radians(coords))cluster_labels = db.labels_# 离群点的聚类标签为-1,其余数据聚成n类,标签为为0到n-1。num_clusters获得总共的聚类数n。num_clusters = len(set(cluster_labels) - set([-1]))print('Clustered ' + str(len(data)) + ' points to ' + str(num_clusters) + ' clusters')data['c_label1'] = cluster_labels# 输出聚类clusters的情况,假如聚成了4类,每类2个点:# 0: [[30.6, 104.0], [30.9, 78.5]],# 1: [[30.6, 104.4], [30.4, 10.0]],# 2: [[30.5, 103.6], [30.7, 103.6]],# 3: [[30.8, 104.9], [30.3, 104.3]clusters = pd.Series([coords[cluster_labels == n] for n in range(num_clusters)])print(clusters)# 输计算噪声点占总点数的比例ratio = len(cluster_labels[cluster_labels[:] == -1]) / len(cluster_labels)print('噪声点占总点数的比例: ' + str(ratio))# 只有聚类数量>1时才能计算指标if num_clusters > 1:# 计算轮廓系数,作为聚类评价指标sc_score = metrics.silhouette_score(coords, cluster_labels)print('轮廓系数: ' + str(sc_score))# 计算DBI指标dbi_score = metrics.davies_bouldin_score(coords, cluster_labels)print('戴维斯-布尔丁指数: ' + str(dbi_score))print("\n")return data
3.聚类评价
需要注意的是,每辆车聚类之后,还计算了噪声比、轮廓系数(SC)、戴维斯-布尔丁指数(DBI)来评价聚类效果。其中SC指标越接近1,聚类效果越好;DBI指标越小,聚类效果越好。
除此之外,还可以使用matplotlib库通过绘制散点图的方式,来肉眼观察这辆车的聚类效果,只需在cluster_traj函数中的return语句前插入下列代码(matplotlib绘制的散点图用于实验时判断聚类效果来调整参数,若要绘制更美观的图,可考虑使用folium库在地图上绘制轨迹点):
# 获得每个聚类的中心点centermost_points = clusters.map(get_centermost_point)# 将各个聚类的中心点存入rep_pointslats, lons = zip(*centermost_points)rep_points = pd.DataFrame({'lon': lons, 'lat': lats})# 绘制散点图colors = list(mcolors.TABLEAU_COLORS.values()) # 使用Tableau颜色作为聚类颜色noise_color = 'black' # 离群点颜色fig, ax = plt.subplots(figsize=(12, 8))for i, cluster in enumerate(clusters):if i == len(colors): # 如果聚类数超过颜色数,循环使用颜色color = colors[i % len(colors)]else:color = colors[i]ax.scatter(cluster[:, 1], cluster[:, 0], s=30, c=color, marker='o', label='Cluster ' + str(i))# 绘制离群点noise_points = coords[cluster_labels == -1]ax.scatter(noise_points[:, 1], noise_points[:, 0], s=20, c=noise_color, marker='x', label='Noise points')ax.scatter(rep_points['lon'], rep_points['lat'], c='red', marker='*', s=100, label='Cluster Centers')ax.set_title('DBSCAN Clustering of Trajectory Data')ax.set_xlabel('Longitude')ax.set_ylabel('Latitude')ax.legend()plt.show()
二、整个数据集多辆车聚类
本人的数据集中包含多辆车的轨迹数据,这些数据统一存储一个CSV文件中,并且已经按照id和collect_time数据升序排序。
1.聚类
使用groupby的方式对车辆按id分组,每组分别调用cluster_traj即可。
#假设已经读入数据dfclustered_data = pd.DataFrame()# 按车辆id分组,对每辆车的数据进行聚类grouped = df.groupby('id')for name, group in grouped:print('车辆id:' + name + ' 轨迹点数:' + str(len(group)))clustered_group = cluster_traj(group)clustered_data = pd.concat([clustered_data, clustered_group], ignore_index=True)
2.整体评价
可以在函数外设置两个全局变量列表sc_scores和dbi_scores存储每辆车的评价指标。
# 全局变量用于存储指标
sc_scores = []
dbi_scores = []
对cluser_traj函数中的计算轮廓系数部分添加sc_scores.append(sc_score)和dbi_scores.append(dbi_score)两行代码。即计算每辆车的评价指标的同时,将其加入外部的列表中。
if num_clusters > 1:# 计算轮廓系数,作为聚类评价指标sc_score = metrics.silhouette_score(coords, cluster_labels)print('轮廓系数: ' + str(sc_score))sc_scores.append(sc_score)# 计算DBI指标dbi_score = metrics.davies_bouldin_score(coords, cluster_labels)print('戴维斯-布尔丁指数: ' + str(dbi_score))dbi_scores.append(dbi_score)
通过sc_scores和dbi_scores两个列表的分析,例如求均值、中位数、画图查看分布等方式,可以评价整个数据聚类效果的好坏。
相关文章:
【车辆轨迹处理】python实现轨迹点的聚类(一)——DBSCAN算法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、单辆车轨迹的聚类与分析1.引入库2.聚类3.聚类评价 二、整个数据集多辆车聚类1.聚类2.整体评价 前言 空间聚类是基于一定的相似性度量对空间大数据集进行分组…...
Apache Kylin
Apache Kylin 是一个开源的分布式分析引擎,提供 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据集。它能在亚秒级的时间内提供 PB 级数据的查询能力,非常适合大数据分析和报表系统。 ### 入门指南 #### 1. 环境准备 首先…...
为何Vue3比Vue2快
Proxy响应式 PatchFlag 编译模板时,动态节点做标记标记,分为不同的类型,如TEXT PROPSdiff算法时,可以区分静态节点,以及不同类型的动态节点 <div>Hello World</div> <span>{{ msg }}</span>…...
人工智能与社交变革:探索Facebook如何领导智能化社交平台
在过去十年中,人工智能(AI)技术迅猛发展,彻底改变了我们与数字世界互动的方式。Facebook作为全球最大的社交媒体平台之一,充分利用AI技术,不断推动社交平台的智能化,提升用户体验。本文将深入探…...
八股文之java基础
jdk9中对字符串进行了一个什么优化? jdk9之前 字符串的拼接通常都是使用进行拼接 但是的实现我们是基于stringbuilder进行的 这个过程通常比较低效 包含了创建stringbuilder对象 通过append方法去将stringbuilder对象进行拼接 最后使用tostring方法去转换成最终的…...
深度挖掘行情接口:股票市场中的关键金融数据API接口解析
在股票市场里,存在若干常见的股票行情数据接口,每一种接口皆具备独特的功能与用途。以下为一些常见的金融数据 API 接口,其涵盖了广泛的金融数据内容,其中就包含股票行情数据: 实时行情接口 实时行情接口:…...
逆向破解 对汇编的 简单思考
逆向破解汇编非常之简单 只是一些反逆向技术非常让人难受 但网络里都有方法破解 申请变量 : int a 0; 00007FF645D617FB mov dword ptr [a],0 char b b; 00007FF645D61802 mov byte ptr [b],62h double c 0.345; 00007FF645D61…...
搜维尔科技:人机交互学术应用概览
人机交互学术应用概览 搜维尔科技:人机交互学术应用概览...
植物遗传转化相关介绍【卡梅德生物】
植物的遗传转化是指以植物器官、组织、细胞或原生质体作为受体,应用重组DNA技术,将外源基因导入植物基因组,以获得转基因植物的技术。目前应用最普遍的植物基因的遗传转化方法主要有农杆菌介导法和DNA直接转入法。 一.植物遗传转化…...
0711springNews新闻系统管理 实现多级评论
0611springmvc新闻系统管理-CSDN博客 0711springNews新闻系统管理项目包 实现多级评论-CSDN博客 数据库字段 需要添加父节点id,通过该字段实现父评论和子评论的关联关系。 对象属性 实现链表,通过一个父评论可以找到它对应的所有子孙评论。 业务层 实现…...
如何在Ubuntu上安装并启动SSH服务(Windows连接)
在日常的开发和管理工作中,通过SSH(Secure Shell)连接到远程服务器是一个非常常见的需求。如果你在尝试通过SSH连接到你的Ubuntu系统时遇到了问题,可能是因为SSH服务未安装或未正确配置。本文将介绍如何在Ubuntu上安装并启动SSH服…...
docker build时的网络问题
docker build时无法yum安装包,因为无法访问外网,无法ping通外网。 解决办法: systemctl stop NetworkManager.service firewall-cmd --permanent --zonetrusted --change-interfacedocker0 systemctl start NetworkManager.service systemct…...
Vue的安全性:防范XSS攻击与安全最佳实践
引言 随着Web应用的普及,前端安全问题日益受到重视。Vue作为当下流行的前端框架,其安全性也成为开发者关注的焦点。跨站脚本攻击(XSS)是常见的Web安全漏洞之一,本文将讨论如何在使用Vue时防范XSS攻击,并分享其他Vue中的安全最佳实践。 什么是XSS攻击? XSS攻击是一种将…...
ARM架构(一)—— ARMV8V9基础概念
目录 1.ARMCore的时间线2.ARM术语小结2.1 A64和arrch642.2ARM架构现在的5个系列2.3 微架构2.4 PE2.5 Banked2.6 ARM文档术语2.7 IMPLEMENTATION DEFINFD 和 DEPRECATED2.8 EL1t和EL1h 3 ARMv7的软件架构4 安全状态切换模型4.1 Secure state和Non-secure state介绍 5 Interproce…...
如何使用Python进行数据分析
Python是一种广泛应用于数据科学和机器学习领域的编程语言。本文将介绍如何使用Python进行数据分析,包括Python在数据分析中的应用场景、常用库和工具,以及实际案例分析。 一、Python在数据分析中的应用场景 数据清洗:处理缺失值、异常值&a…...
Python学习笔记40:游戏篇之外星人入侵(一)
前言 入门知识已经学完,常用标准库也了解了,pygame入门知识也学了,那么开始尝试小游戏的开发。 当然这个小游戏属于比较简单的小游戏,复杂的游戏需要长时间的编写累计开发经验,同时也需要一定的时间才能编写出来。现在的话还是嫩…...
R的数据集读取和利用,如何高效地直接复制黏贴数据到R
R语言自带了许多内部数据集,这些数据集不仅为初学者提供了丰富的练习资源,还为研究人员和数据分析师提供了方便的数据测试和模型验证工具。在这篇文章中,我们将详细探讨如何读取和使用数据集。 一、认识数据集 1、数据和数据集 数据(Data)是指以某种形式表示…...
@JsonProperty 踩坑
JsonProperty 在fastjson 和 hutooljson 中是不会生效的。 在 fastjson 中,对应的注解是 JSONField。如果你正在使用 fastjson 进行 JSON 的序列化和反序列化,并且想要改变字段的 JSON 属性名,你应该使用 JSONField 注解,而不是 …...
业务架构、数据架构、应用架构和技术架构分析
一文看懂:什么是业务架构、数据架构、应用架构和技术架构 TOGAF(开放集团架构框架)是企业广泛应用的架构设计和管理利器。其核心在于四大架构领域:业务、数据、应用和技术,助力组织高效运作。TOGAF,让架构设…...
android studio中svn的使用
第一步,建立一个项目。 第二步,share project。 第三步,选择存放的位置,然后添加提交信息,最后点击share。这样就可以在svn上面看到一个空的项目名称。 第四步,看到文件变成了绿色,点击commit图…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
