当前位置: 首页 > news >正文

【车辆轨迹处理】python实现轨迹点的聚类(一)——DBSCAN算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、单辆车轨迹的聚类与分析
    • 1.引入库
    • 2.聚类
    • 3.聚类评价
  • 二、整个数据集多辆车聚类
    • 1.聚类
    • 2.整体评价


前言

  空间聚类是基于一定的相似性度量对空间大数据集进行分组的过程。空间聚类分析是一种无监督形式的机器学习。通过空间聚类可以从空间数据集中发现隐含的信息。
  作者在科研工作中,需要对某些车辆的轨迹数据进行一些空间聚类分析,以期望发现车辆在行驶过程中发生轨迹点”聚集“的行为。当等时间间隔的轨迹点在某片区域分布过于”密“时,我们往往可以在这片区域发现某些信息,例如车辆在这片区域发生驻留或者低速行驶等。
  在空间聚类算法中,DBSCAN是一种简单且有效的聚类算法,它有着基于密度不需要预先指定聚类数计算效率高的优点。
  本文以如下格式车辆轨迹数据为例,实提供了DBSCAN对车辆轨迹数据聚类并分析的方法:

collect_timeidlonlat
时间车辆标识经度纬度

  为了尽量去除噪声影响,车辆轨迹数据已经经过滤波平滑,平滑方法可见作者之前文章:https://blog.csdn.net/jgsecurity/article/details/140608431。

一、单辆车轨迹的聚类与分析

  对单辆车的轨迹数据,采用DBSCAN算法进行空间聚类。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种经典的密度聚类算法,适用于发现任意形状的聚类簇。其原理本文不做阐述,如有需要,可以自行搜索。

1.引入库

  使用了数学计算库numpypandas,机器学习库scikit-learn,地理相关库shapelygeopy,绘图库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.聚类

  在进行聚类之前,先使用shapelygeopy库实现了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 编译模板时&#xff0c;动态节点做标记标记&#xff0c;分为不同的类型&#xff0c;如TEXT PROPSdiff算法时&#xff0c;可以区分静态节点&#xff0c;以及不同类型的动态节点 <div>Hello World</div> <span>{{ msg }}</span>…...

人工智能与社交变革:探索Facebook如何领导智能化社交平台

在过去十年中&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;彻底改变了我们与数字世界互动的方式。Facebook作为全球最大的社交媒体平台之一&#xff0c;充分利用AI技术&#xff0c;不断推动社交平台的智能化&#xff0c;提升用户体验。本文将深入探…...

八股文之java基础

jdk9中对字符串进行了一个什么优化&#xff1f; jdk9之前 字符串的拼接通常都是使用进行拼接 但是的实现我们是基于stringbuilder进行的 这个过程通常比较低效 包含了创建stringbuilder对象 通过append方法去将stringbuilder对象进行拼接 最后使用tostring方法去转换成最终的…...

深度挖掘行情接口:股票市场中的关键金融数据API接口解析

在股票市场里&#xff0c;存在若干常见的股票行情数据接口&#xff0c;每一种接口皆具备独特的功能与用途。以下为一些常见的金融数据 API 接口&#xff0c;其涵盖了广泛的金融数据内容&#xff0c;其中就包含股票行情数据&#xff1a; 实时行情接口 实时行情接口&#xff1a…...

逆向破解 对汇编的 简单思考

逆向破解汇编非常之简单 只是一些反逆向技术非常让人难受 但网络里都有方法破解 申请变量 &#xff1a; int a 0; 00007FF645D617FB mov dword ptr [a],0 char b b; 00007FF645D61802 mov byte ptr [b],62h double c 0.345; 00007FF645D61…...

搜维尔科技:人机交互学术应用概览

人机交互学术应用概览 搜维尔科技&#xff1a;人机交互学术应用概览...

植物遗传转化相关介绍【卡梅德生物】

植物的遗传转化是指以植物器官、组织、细胞或原生质体作为受体&#xff0c;应用重组DNA技术&#xff0c;将外源基因导入植物基因组&#xff0c;以获得转基因植物的技术。目前应用最普遍的植物基因的遗传转化方法主要有农杆菌介导法和DNA直接转入法。 一&#xff0e;植物遗传转化…...

0711springNews新闻系统管理 实现多级评论

0611springmvc新闻系统管理-CSDN博客 0711springNews新闻系统管理项目包 实现多级评论-CSDN博客 数据库字段 需要添加父节点id&#xff0c;通过该字段实现父评论和子评论的关联关系。 对象属性 实现链表&#xff0c;通过一个父评论可以找到它对应的所有子孙评论。 业务层 实现…...

如何在Ubuntu上安装并启动SSH服务(Windows连接)

在日常的开发和管理工作中&#xff0c;通过SSH&#xff08;Secure Shell&#xff09;连接到远程服务器是一个非常常见的需求。如果你在尝试通过SSH连接到你的Ubuntu系统时遇到了问题&#xff0c;可能是因为SSH服务未安装或未正确配置。本文将介绍如何在Ubuntu上安装并启动SSH服…...

docker build时的网络问题

docker build时无法yum安装包&#xff0c;因为无法访问外网&#xff0c;无法ping通外网。 解决办法&#xff1a; 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进行数据分析&#xff0c;包括Python在数据分析中的应用场景、常用库和工具&#xff0c;以及实际案例分析。 一、Python在数据分析中的应用场景 数据清洗&#xff1a;处理缺失值、异常值&a…...

Python学习笔记40:游戏篇之外星人入侵(一)

前言 入门知识已经学完&#xff0c;常用标准库也了解了,pygame入门知识也学了&#xff0c;那么开始尝试小游戏的开发。 当然这个小游戏属于比较简单的小游戏&#xff0c;复杂的游戏需要长时间的编写累计开发经验&#xff0c;同时也需要一定的时间才能编写出来。现在的话还是嫩…...

R的数据集读取和利用,如何高效地直接复制黏贴数据到R

​​​​​​R语言自带了许多内部数据集,这些数据集不仅为初学者提供了丰富的练习资源,还为研究人员和数据分析师提供了方便的数据测试和模型验证工具。在这篇文章中,我们将详细探讨如何读取和使用数据集。 一、认识数据集 1、数据和数据集 数据(Data)是指以某种形式表示…...

@JsonProperty 踩坑

JsonProperty 在fastjson 和 hutooljson 中是不会生效的。 在 fastjson 中&#xff0c;对应的注解是 JSONField。如果你正在使用 fastjson 进行 JSON 的序列化和反序列化&#xff0c;并且想要改变字段的 JSON 属性名&#xff0c;你应该使用 JSONField 注解&#xff0c;而不是 …...

业务架构、数据架构、应用架构和技术架构分析

一文看懂&#xff1a;什么是业务架构、数据架构、应用架构和技术架构 TOGAF&#xff08;开放集团架构框架&#xff09;是企业广泛应用的架构设计和管理利器。其核心在于四大架构领域&#xff1a;业务、数据、应用和技术&#xff0c;助力组织高效运作。TOGAF&#xff0c;让架构设…...

android studio中svn的使用

第一步&#xff0c;建立一个项目。 第二步&#xff0c;share project。 第三步&#xff0c;选择存放的位置&#xff0c;然后添加提交信息&#xff0c;最后点击share。这样就可以在svn上面看到一个空的项目名称。 第四步&#xff0c;看到文件变成了绿色&#xff0c;点击commit图…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...