轨迹数据挖掘
本文内容主要来自《Computing with spatial trajectories》一书第二章,并结合郑宇博士的PPT。
轨迹数据挖掘的范式
首先介绍轨迹数据挖掘的范式,即下图。最下面是Spatial Trajectories,即地理轨迹数据,主要通过GPS、智能设备、wifi等前端设备收集。接着向上经过Trajectory Preprocessing,即轨迹预处理,这部分内容主要包括轨迹数据的压缩和去噪,读者可以看这篇文章。经过预处理后,轨迹数据即可导入数据库,数据库涉及到如何对数据进行索引和检索,也就是说本文要介绍的内容。再向上即涉及到轨迹数据挖掘的应用,例如轨迹不确定性消除、轨迹模式挖掘、轨迹分类、轨迹异常值检测等等。
文章目录
本文结构如下:首先介绍传统的地理数据库索引、查询技术。接下来介绍针对轨迹数据的查询类型。第三部分和第四部分是实现轨迹数据查询的基础,其中第三部分说的是轨迹数据的距离测量标准,第四部分是轨迹数据的索引结构。说完了基础,第五部分真正开始介绍检索算法。
地理数据库(Spatial Databases)
地理数据查询(Spatial Queries)
传统的数据库查询有两种基本类型,即“最近邻查询”和“范围查询”。 - “最近邻查询”就是给定一个点或者一个目标,找到满足给定条件的最近目标。 - “范围查询”就是给定一个地理区域,查询部分或全部位于该范围内的目标。
地理数据索引数据结构(Spatial Indexing Structures)
按照分类标准的不同,地理数据索引的数据结构可以分为两大类。 - “基于空间划分的索引结构” - 基于网格的 - 四象限树 - K维树 - “数据驱动的索引结构” - R树
基于网格的地理数据索引(Grid-based Spatial Indexing)
如何建立索引?基于网格的索引将地理空间划分为相邻且唯一的网格,在每个网格和网格中的点之间建立反向索引。例如图中g1这个网格中包含p1和p3两个点。
如何进行范围查询?首先找到与范围重叠的网格,然后判断网格中的点是否属于该范围。
如何进行“最近邻查询”,测距标准可以选用欧式距离,当然,欧式距离与现实中的真实距离非常不同。查询时有两种情况,一种情况是最近的点与目标点在同一个网格内,另一种情况就是不在同一个网格内,所以可以采用快速的估计方法,即把目标点周围的网格(必须能够包含查询范围)都作为候选网格,在候选网格中找最近点。
网格结构的优点: - 容易部署和理解 - 范围和最近邻查询非常高效
网格结构的缺点: - 网格的索引可能会非常大 - 难以处理不平衡的数据
四象限树(Quad-Tree)
如何建立索引? - 四象限树种的每一个节点都是一个地理为重空间中的一个长方形区域;根节点代表整个空间 - 每一个非叶节点将空间划分为4个大小相等的空间 - 每一个叶节点包含0到一个固定数字数量的点。图中这个固定数字是1。
如何进行范围查询?按照与查询范围重叠的区域由根节点到叶节点查询树结构。
如何进行最近邻查询?很难实现!
K维树(K-D Tree)
如何建立索引?除了最外框的线之外,每一条线代表k-d树种的一个节点。图中线段的数量代表相应节点出现的树的层级。
以下图举例,如果我想找到左上角的两个点,首先,从根节点出发(X=5),这两个点在X<5的方向,这个方向即Y=5,接着向Y>5的方向走,这个方向得到两个叶节点,即我们想要的点。这两个点所在的区域除了外框,有两条边,所以这两个点在树结构的第二层级(根节点为0层级)。
如何范围查询?假设找图中红色范围的点,该范围有两个坐标确定,即(4,7)和(7,5),同过该范围,我们查询树结构,确定查询范围为3个长方形区域,最后判断范围内的点与查询区域是否重叠。
如何查询最近邻?首先找到对应的切割面,再找到最近邻。
R树(R-tree)
R树的基本单元:最小外接矩形(MBR,Minimum Bounding Rectangle),简单说就是能把左边这些点都包含起来的最小的矩形。通常我们使用两个点来代表该矩形,即左下和右上的两个点。
我们可以把聚集的数据点都用MBR包含起来,这里MBR可以重叠(数据不能重叠),还可以进一步将多个MBR再组合为更大的MBR。
最终得到如下的树结构:
如何进行“最近邻查询”?通过计算欧式距离,找到对应的MBR,再在MBR中找到最近邻。
算法比对分析
最后从对不平衡数据的处理、范围查询、最近邻查询、构建、结构平衡性、存储要求方面比较上述算法。表中结论R-tree是相对较好的数据结构。
轨迹查询类型
与传统的位置查询相同,轨迹查询也可以分为“区域查询”和“最近邻查询”两类。 具体来说,区域查询的意思是给定一个区域,检索数据库中所有通过该区域的轨迹。 最近邻查询又可以分为两类,一类是给定多个点,查询与这些点距离最近的k条轨迹。另一类是给定一条轨迹,查找与该轨迹距离最近的k条轨迹。
解决上述查询问题,需要首先解决两个问题,即测距标准和索引数据结构。下面首先讨论测距标准。
距离度量
按照测距的对象不同,距离度量可以分为3类: - 一个点q和一条轨迹之间的距离 - 两条轨迹之间的距离 - 两条轨迹段之间的距离
一个点q和一条轨迹之间的距离
q为一个点,A为一条轨迹,他们两个之间的距离可以用D(q,A)表示,D(q,A)等于A中与q距离最小的点p到q的距离。Q代表多个点q的集合,D(Q,A)表示Q与A之间的距离,D(Q,A)等于Q中每一点的D(q,A)取指数后的和。而Q和A之间的相似度S(Q,A),定义为先对D(q,A)取负,再取指数后的和,因为距离越远,D(q,A)越大,而相似度应该越小。
两条轨迹之间的距离
两条轨迹之间的距离度量有很多算法,本质上这些算法是时间序列相似性问题,以下分别介绍:
- 最简单的算法,最近配对距离(Closest-Pair Distance:CPD),就是使用轨迹A和B中距离最近的两个点之间的距离作为这两个轨迹的距离。
- 配对求和算法(sum-of-Pairs Distance),就是将两个轨迹中对应点之间的距离相加。
- 动态时间规整算法(Dynamic Time Warping:DTW),解决的是配对求和算法时,无法保证两条轨迹的点能一一对应的情况。
- 该算法为了得到最佳匹配,允许对轨迹中的一些点重复使用
- 动机是解决一些噪声的匹配可能引起较大的距离度量差问题
- 该方法不满足三角不等式(D(AC) >D(AB) + D(BC))所以不能算一个距离度量
- 该方法计算量大,时间复杂度为O(mn)
- 最长公共子序列算法(Longest Common Sub-Sequence:LCSS)
- 跳过一些噪声点 - 使用阈值来判定两个点是否匹配
- 比如字符串1:BDCABA;字符串2:ABCBDAB,则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA。
- 求解方法是动态规划
- 实序列编辑距离(Edit Distance on Real Sequence: EDR):就是求两个序列之间的编辑距离,即两个序列增、删、替换需要的次数。
- 阈值
- 对于匹配的子序列的间距增加了一个惩罚项,例如对于序列1:abc,序列2:abddc,LCSS得到的长度是一样的,但是编辑距离多1。因此编辑距离比LCSS更准确。
- ERP距离
- 结合了DTW和EDR
- 满足三角不等式,是度量标准
两条轨迹段之间的距离
两种方法: - 基于最小外界矩形的方法 - 豪斯多夫距离,计算两个多边形之间的最大距离,用于表示相似性
索引结构和算法
为了满足检索的需求,前面已经介绍了传统的数据结构可以实现区域检索,但是如果我们想对某段时间的轨迹进行检索,如何设计数据结构? 轨迹数据结构按照可以分为3类,第一类是将时间看成一个单独的维度,经典算法有3DR-Tree,STR-Tree,TB-Tree。第二类是将时间切割为时间段,每个时间段有一个单独的R-Tree,不同时间段的R-Tree之间如果有重复的数据,则直接指向之前的R-Tree。第三类算法是将轨迹数据切分后放在不同的网格中,每个网格中有一个时间索引。
3D R-tree
3D R-tree就是在R-tree的基础上增加一个时间维度。
Multi-version R-tree
Multi-version R-tree的索引,先找到对应的时间,然后在对应的R-tree中找到对应的轨迹。
CSE-Tree
CSE-Tree就是将轨迹切分为不同的网格,每个网格有时间索引。
如果我们将横坐标设为开始时间,纵坐标设为结束时间,那么我们可以将所有网格P画在一个平面上,且这些网格都落在45度线上面,因为结束时间一定大于开始时间。 一个基于时间的查询,就是坐标中的灰色区域。只有开始时间大于查询的最小时间,结束时间小于查询的最大时间的区域才符合查询要求。
再创建两个B-Tree用于索引Te和Ts
索引的过程是,首先,利用结束时间索引找到相应的开始时间索引,再在开始时间索引中找到对应的轨迹。
压缩方法,如果某些轨迹很少被差,那么没必要建立一个树结构,直接使用动态数组即可。
kNN检索
前面已经介绍了如何检索一个点周围最近的点,那么如何检索多个点最近的轨迹? 这就是kNN检索。
一个应用就是,给了一些经典坐标,如何在成千上网条轨迹中找到最优的轨迹。
相似性函数Sim(Q,R) 第一步,先找到轨迹R中与给定点最近的点 第二步,利用相似性度量,计算距离。
k-BCT就是“k最好连接轨迹”查询,就是给定一个轨迹集T,和一个目标集Q,还有相似性函数Sim(Q,R),k-BCT查询就是找到k条有最高相似性的轨迹。
IKNN算法 第一步,索引所有轨迹点,得到目标点与轨迹之间的最短距离,以及对应的点。 第二步,得到f条轨迹,满足最近的lambda条距离。
第三步,求每条轨迹的距离下限。
第四步,求每条轨迹的上限。
第五步,找到k个最小相似度(下限)比其他的轨迹的最大相似度(上限)还大的轨迹集,如果该集不够k个轨迹,则增加lambda。
以上就是全部的轨迹数据索引技术介绍,谢谢!欢迎留言!