前两篇博客对TRACLUS算法进行了综述和概要说明了该框架有两个阶段,分段和归组。这篇博客将详细对轨迹分段这一阶段进行说明。

轨迹分段TRAJECTORY PARTITIONING

1、相关属性

轨迹分段的首要目标是找到轨迹行为迅速变化的点(直观地说,就是角度变化大的点),称之为特征点。从轨迹java轨迹算法 轨迹分类算法_特征点中确定了一组特征点java轨迹算法 轨迹分类算法_自动驾驶_02。然后,轨迹java轨迹算法 轨迹分类算法_elasticsearch_03被每个特征点分段,每个分段用两个连续特征点之间的一条线段表示。也就是说,java轨迹算法 轨迹分类算法_elasticsearch_03被划分为一组java轨迹算法 轨迹分类算法_java轨迹算法_05个线段java轨迹算法 轨迹分类算法_elasticsearch_06。把这样的线段称为轨迹分段。下图显示了一个轨迹及其轨迹分段的示例。

java轨迹算法 轨迹分类算法_elasticsearch_07


一个轨迹的最优分段要具有两个属性:准确性简洁性

准确性是指轨迹与其一组轨迹分段之间的差异应该尽可能小,这就要求特征点不能太少。

简洁性是指轨迹分段的数量应该尽可能少。

这两个属性在确定特征点数目时相互矛盾的,这就需要调整算法以达到平衡。

2、最小描述长度原则(Minimum Description Length,MDL)

在确定轨迹特征点时,提出了一种寻找精确和简洁之间最优权衡的方法,在信息论中广泛使用的最小描述长度(MDL)原理

最小描述长度( MDL) 原理是 Rissane 在研究通用编码时提出的。其基本原理是对于一组给定的实例数据 D , 如果要对其进行保存 ,为了节省存储空间, 一般采用某种模型对其进行编码压缩,然后再保存压缩后的数据。同时, 为了以后正确恢复这些实例数据,将所用的模型也保存起来。所以需要保存的数据长度( 比特数) 等于这些实例数据进行编码压缩后的长度加上保存模型所需的数据长度,将该数据长度称为总描述长度。最小描述长度( MDL) 原理就是要求选择总描述长度最小的模型。

MDL的代价有两部分:java轨迹算法 轨迹分类算法_java轨迹算法_08java轨迹算法 轨迹分类算法_java轨迹算法_09。这里,java轨迹算法 轨迹分类算法_java轨迹算法_10代表压缩模型,java轨迹算法 轨迹分类算法_特征点_11代表数据。这两个代价的表述如下:java轨迹算法 轨迹分类算法_java轨迹算法_08是描述压缩模型(或编码方式)所需要的长度,以位表示;java轨迹算法 轨迹分类算法_java轨迹算法_09是描述利用压缩模型所编码的数据所需要的长度,以位表示。

在轨迹分段问题中,一个压缩模型对应于一组特定的轨迹分段。因此,找到最优分段可以转化为使用MDL原则找到最佳假设。

java轨迹算法 轨迹分类算法_特征点_14


上图表示了两个代价java轨迹算法 轨迹分类算法_java轨迹算法_08java轨迹算法 轨迹分类算法_java轨迹算法_09的公式。假定有一个轨迹java轨迹算法 轨迹分类算法_特征点,和一组特征点java轨迹算法 轨迹分类算法_java轨迹算法_18。那么,java轨迹算法 轨迹分类算法_java轨迹算法_08可表示为

java轨迹算法 轨迹分类算法_自动驾驶_20


其中,java轨迹算法 轨迹分类算法_自动驾驶_21表示一个线段java轨迹算法 轨迹分类算法_特征点_22的长度,即两点的欧式距离。因此java轨迹算法 轨迹分类算法_java轨迹算法_08表示所有轨迹分段长度的总和

另一方面,java轨迹算法 轨迹分类算法_java轨迹算法_09可表示为

java轨迹算法 轨迹分类算法_自动驾驶_25


java轨迹算法 轨迹分类算法_java轨迹算法_09表示一条轨迹和它的一组轨迹分段的差值之和。对每一个轨迹分段java轨迹算法 轨迹分类算法_特征点_22,将这条轨迹分段与其包含的线段java轨迹算法 轨迹分类算法_算法_28的差值进行累加。对于这个差值的计算,使用垂直距离和角度距离的和。因为这条轨迹包含轨迹分段,所以不考虑平行距离

java轨迹算法 轨迹分类算法_java轨迹算法_08衡量的是简洁性,它随着轨迹分段数量的增加而增加;java轨迹算法 轨迹分类算法_java轨迹算法_09衡量的是准确性,它随着一组轨迹分段偏离轨迹的偏离度增加而增加。

因此,要得到最优的分段策略,那就是要最小化java轨迹算法 轨迹分类算法_算法_31,这能够准确平衡简洁性和准确性。但是因为要考虑到轨迹点的每一个子集,那计算量是非常大,所以下面要介绍一个近似计算的方法。

3、近似计算方法

近似方法的关键思想是将局部最优的集合视为全局最优java轨迹算法 轨迹分类算法_特征点_32代表java轨迹算法 轨迹分类算法_自动驾驶_33java轨迹算法 轨迹分类算法_elasticsearch_34只是特征点时二者之间轨迹的java轨迹算法 轨迹分类算法_自动驾驶_35代价。java轨迹算法 轨迹分类算法_算法_36代表java轨迹算法 轨迹分类算法_自动驾驶_33java轨迹算法 轨迹分类算法_elasticsearch_34之间没有特征点时的java轨迹算法 轨迹分类算法_算法_39代价,即保留原始轨迹。java轨迹算法 轨迹分类算法_算法_36中的java轨迹算法 轨迹分类算法_elasticsearch_41是零。那么局部最优解就是当满足对于任意java轨迹算法 轨迹分类算法_java轨迹算法_42都有java轨迹算法 轨迹分类算法_特征点_43时最长的轨迹java轨迹算法 轨迹分类算法_特征点_44。如果前者小于后者,可以知道选择java轨迹算法 轨迹分类算法_特征点_45作为特征点的java轨迹算法 轨迹分类算法_算法_39代价要比不作为特征点时更小。更进一步的说,为了简洁起见,我们尽可能地增加了这个轨迹分段的长度。

java轨迹算法 轨迹分类算法_java轨迹算法_47


上图表达了轨迹分段的近似算法。计算一条轨迹上每一个点的java轨迹算法 轨迹分类算法_自动驾驶_48java轨迹算法 轨迹分类算法_算法_49(5~6行)。如果前者更大,则立即将上一个点java轨迹算法 轨迹分类算法_java轨迹算法_50插入到特征点的集合java轨迹算法 轨迹分类算法_elasticsearch_51(8行)。然后将从这个点开始重复上述步骤(9行)。否则,增加候选轨迹分段的长度(11行)。

当然,该算法可能无法找到最优的分段。在下图中举一个简单的例子。假设java轨迹算法 轨迹分类算法_算法_39代价最小的最优分段为java轨迹算法 轨迹分类算法_自动驾驶_53。该算法无法找到精确的解,因为在java轨迹算法 轨迹分类算法_自动驾驶_54处,java轨迹算法 轨迹分类算法_自动驾驶_55大于java轨迹算法 轨迹分类算法_特征点_56,因此会停止扫描。然而,该算法的精度却相当高。我们的经验表明,其精度平均约为80%,这意味着80%的近似解也出现在精确解中。

java轨迹算法 轨迹分类算法_java轨迹算法_57