基于IBAT方法的异常轨迹挖掘算法实现

您所在的位置:网站首页 地图轨迹记录生成 基于IBAT方法的异常轨迹挖掘算法实现

基于IBAT方法的异常轨迹挖掘算法实现

2023-03-09 20:35| 来源: 网络整理| 查看: 265

车辆经过高速公路上的收费进出口以及各断面/卡口时,卡口系统利用相关图像处理技术、检测技术、机器视觉技术等识别并记录车牌号、车型、车辆颜色、车辆行驶方向、拍摄时间、收费站/卡口名称等数据,上传至控制中心。这些数据对挖掘车辆违法行为、套牌车、轨迹溯源提供了有效的数据来源。

数据基础

门架/收费站采集数据按时间顺序构建的车辆行驶轨迹数据。数据表包含可用字段如下:

Plate_num 车牌号码

Plate_color 车牌颜色

Happened_time 时间发生时间(进出收费站、经过门架)

Vc_pass_id etc 卡的编号

Traffic_type 通行类型0-正常通行、1-入高速、2-出高速

Station_name 收费站名称

Longitude 收费站位置经度

Latitude 收费站位置维度

Track_id 轨迹ID

IBAT异常轨迹检测算法

IBAT算法是基于孤立的思想进行异常轨迹的挖掘算法,并基于以下两个概念的基础上实现。

1)异常数据在某些方面异于数据样本中的大部分的数据。

2)异常数据在整体数据样本中所占的比例较小。

实现思想及步骤

(映射-分组-异常检测)

a) 网络划分和轨迹映射

首先将地图按指定大小划分为一个个的网格,并且为每个网格分配相应的编号。轨迹由一个个轨迹点所组成,将轨迹的每个轨迹点按所属位置映射到相应的网格区域,轨迹就被一系列网格编号所组成的序列号所表示。

b) 轨迹的分组

在IBAT算法中,对于起点和终点都相近的轨迹将其分为同一个组。对同组之间的轨迹采用孤立思想进行异常轨迹挖掘。

c) 基于孤立思想的异常轨迹挖掘

依次选取组中一条轨迹进行判断。对于选取的轨迹,随机选取该轨迹上的一个轨迹点,将组中不含有该轨迹点的轨迹剔除。重复上述过程,直到达到指定的最大轨迹点随机次数、或该组轨迹中除了选定轨迹以外的全部轨迹都被剔除、或选定轨迹的所有轨迹点都被随机选择过,则结束该条轨迹的判断并选取下一条轨迹进行判断。

对一条轨迹而言,每次轨迹点的选取都是随机的,所以一条轨迹需要进行多次判断,综合考虑多次判断的结果得出最终的异常值分值,异常分值的计算公式如下:

score(x,n)=2^{\frac{E(t(x))}{c(n)}}

c(n)=2In(n-1)+\gamma-\frac{2(n-1)}{n}

其中, x 表示本次选取的样本轨迹; n 表示与 x 同组的轨迹数量; t(x) 表示轨迹 x 与同组其他轨迹分离所需要选取的轨迹点数; E(t(x)) 表示经过多次判断后,轨迹 x 与同组其他轨迹分离所需要选取的平均轨迹点数; c(n) 表示在一组 n 条轨迹的组中,该组中的轨迹与其他轨迹分离需要选取的平均轨迹点数; \gamma=0.57721 为欧拉常数; score(x,n) 表示轨迹 x 在 n 条轨迹所组成的组中,综合考虑多次判断结果得出的最终异常值分值。

代码实现import random import copy import pandas as pd import numpy as np raw_data = pd.read_csv(r'noteblock_33905_1675997046538.csv', ) #建立列表,存储生成的 Tracklist = [] Tracklist_key = [] Tracklist_value = [] group = raw_data.groupby('plate_num') for key, value in group: value = value.reset_index(drop = True) #取出traffic_type为1的dataframe的index list1 = value['traffic_type'] == 1 index = list1[list1 == True].index.tolist() index.append(len(value)) for i in range(len(index) - 1): # 取出第一条station_name和最后一条station_name,构成元组作为字典key new_key = (value.iloc[index[i]]['station_name'], value.iloc[index[i+1]-1]['station_name']) Tracklist_key.append(new_key) # 取出轨迹门架station_name作为中的tralic tralic = (value.iloc[index[i]:index[i+1]]['station_name']).values.tolist() dic = {key : tralic} Tracklist_value.append(dic) # 将每个构造为的形式,并存进列表 dic = {new_key : dic} Tracklist.append(dic) # 对轨迹集合进行分组,轨迹中起点为相同卡口且终点为同一卡口的分为同一组 dic = {} for _ in Tracklist: for k, v in _.items(): dic.setdefault(k, []).append(v) # 对于每组轨迹,执行IBAT异常轨迹识别方法 # 建立列表存储score_dic score_dics = [] #1 依次选取组中每一条轨迹 for key, C_track in dic.items(): print(key) print(C_track) # C_track中至少应保证有5条轨迹 if len(C_track) >= 5: list_index_all = [i for i in range(len(C_track))] for i in list_index_all: # 存放一个临时的list_index_all_temp list_index_all_temp = copy.deepcopy(list_index_all) # 剔除当前所选轨迹,避免后续排除选到 list_index_all_temp.pop(i) # 依次选择组内的每条轨迹 track = C_track[i].values() # 以下过程重复执行120次 counts = [] for n in range(120): # 存放临时的C_track_temp C_track_temp = copy.deepcopy(C_track) #存储记录随机选出的轨迹点 org_id_list = [] # 与其他轨迹分离所需次数 count = 0 while True: #随机选取轨迹上的一个轨迹点 org_id = random.choice(list(track)[0]) org_id_list.append(org_id) #将组中不含有该轨迹点的轨迹剔除 index_list = [] for j in list_index_all_temp: track2 = C_track[j].values() if org_id not in (list(track2)[0]): # 此处应将索引j存进列表里,后续一并去掉 index_list.append(j) # 将C_track_temp 中索引为index_list 的轨迹剔除 for index_number in index_list: value = C_track[index_number] C_track_temp.remove(value) # 更新list_index_all_temp的值 list_index_all_temp = list(set(list_index_all_temp)- set(index_list)) #达到如下三个条件之一,则结束while循环 #1 达到最大轨迹点随机次数 n_max = 20 #2 集合中,除了选定轨迹以外的全部轨迹都从中被剔除 #3 当前选定轨迹中的所有轨迹点都已经被随机选取过 #org_id_list 列表去重,进而判断条件3 org_id_list_unique = list(set(org_id_list)) #实现三个条件判断 if len(org_id_list) >= 20 or len(org_id_list_unique) == len(list(track)[0]) or len(C_track_temp) == 1: break count += 1 counts.append(count) # 计算轨迹的异常分值 c_n = 2 * np.log(len(C_track)) + 0.57721 - 2 * (len(C_track)-1)/len(C_track) score = 2 ** -(sum(counts)/len(counts)) / c_n # 将得分和车辆轨迹信息关联起来 # 组织形式: {{车牌照:轨迹列表} : score} # 参考文献中abscore_threshold取值0.65 if score > 0.5: score_dic = {score : C_track[i]} score_dics.append(score_dic)

本文理论部分参考文章《基于通行大数据的高速公路车辆异常行为挖掘的研究与应用》,特此感谢!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3