轨迹聚类:哪种聚类方法?

Posted

技术标签:

【中文标题】轨迹聚类:哪种聚类方法?【英文标题】:Trajectory Clustering: Which Clustering Method? 【发布时间】:2013-09-20 04:15:59 【问题描述】:

作为机器学习的新手,我有一组可能具有不同长度的轨迹。我希望对它们进行聚类,因为它们中的一些实际上是相同的路径,并且它们只是 看起来不同,因为噪音。

此外,并非它们都具有相同的长度。所以也许虽然轨迹 A 与轨迹 B 不同,但它是轨迹 B 的一部分。我希望在聚类之后也呈现这个属性。

我对@9​​87654321@ 和Fuzzy N-means Clustering 知之甚少。 我该如何在这两者之间进行选择?还是应该采用其他方法?

有没有考虑到“归属感”的方法? (例如,在聚类之后,我有 3 个聚类A, B and C。一个特定的trajectory X 属于cluster A。而较短的trajectory Y,虽然没有聚类在A 中,但被标识为trajectory B 的一部分。 )

=================== 更新======================强>

上述轨迹是行人的轨迹。它们可以表示为一系列(x, y) 点或一系列步进向量(length, direction)。演示文稿由我控制。

【问题讨论】:

您能否详细说明一下您的问题中的轨迹是什么以及它是如何表示的? @rano 感谢您的建议。请查看更新后的问题。:) 我猜你的问题现在更多地属于顺序模式匹配/挖掘,而不是简单的聚类问题 @rano 可以进一步指导我正确的方向吗? 【参考方案1】:

可能有点晚了,但我也在解决同样的问题。 我建议你看看 TRACLUS,这是一种由 Jae-Gil Lee、Jiawei Han 和 Kyu-Young Wang 创建的算法,发表在 SIGMOD'07。 http://web.engr.illinois.edu/~hanj/pdf/sigmod07_jglee.pdf

这是迄今为止我见过的对轨迹进行聚类的最佳方法,因为:

可以发现常见的子轨迹。 专注于段而不是点(因此它过滤掉噪声异常值)。 它适用于不同长度的轨迹。

基本上是一个两阶段的方法:

    第一阶段 - 分区:将轨迹划分为段,这是使用复杂度为 O(n) 的 MDL 优化完成的,其中 n 是给定轨迹中的点数。这里输入是一组轨迹,输出是一组线段。

    复杂度:O(n),其中 n 是轨迹上的点数 输入:一组轨迹。 输出:D 组片段

    第二阶段 - 组:此阶段使用某些版本的基于密度的聚类(如 DBSCAN)来发现聚类。此阶段的输入是从第一阶段获得的一组线段以及构成邻域的一些参数以及可以构成集群的最小线数。输出是一组集群。聚类是在段上完成的。他们定义了自己的距离测量,由 3 个组件组成:平行距离、垂直距离和角距离。此阶段的复杂度为 O(n log n),其中 n 是段数。

    复杂度:O(n log n) 其中 n 是集合 D 上的段数 输入:线段集 D,设置邻域阈值的参数 E 和最小线数的参数 MinLns。 输出:Set C of Cluster,即线段集群(轨迹聚类)。

最后,他们为每个集群计算了一个代表性轨迹,这与 在每个集群中发现的共同子轨迹无关。

他们有很酷的例子,论文解释得很好。再说一次,这不是我的算法,所以如果你在做研究,别忘了引用它们。

PS:我根据他们的工作制作了一些幻灯片,仅用于教育目的: http://www.slideshare.net/ivansanchez1988/trajectory-clustering-traclus-algorithm

【讨论】:

很好的答案,这正是最终使用的方法(1 年前,哈哈)。 酷@SibbsGambling,您的结果接近您的预期。如果您有兴趣,我可以在完成研究后发布我尝试近似轨迹聚类的结果。我的计划是通过局部敏感哈希使用近似值来降低时间复杂度。 以防万一有人感兴趣,这是我对 traclus 算法的实现(在 Java 中)。需要一些重构和调整,但正在工作。 github.com/ivansanchezvera/TrajectoryClustering @1vand1ng0 您的实现是否支持 3D 位置?我发现的每个 TraClus 实现都只是 2D 的,尽管原始论文说任何数量的维度都是可能的。 @beldaz 我的实现只支持二维位置。几年前我就这样做了,我认为我的实现不是最有效的,我的技能有所提高但没有时间重做项目,所以我建议你自己做更好的开发实现 =) 。我想你可以用计算开销将它外推到任意数量的维度来计算距离,我认为 3 维度是可行的。【参考方案2】:

每个聚类算法都需要一个指标。您需要定义样本之间的距离。在您的情况下,简单的欧几里得距离不是一个好主意,特别是如果轨迹可以有不同的长度。

如果您定义一个指标,那么您可以使用任何允许自定义指标的聚类算法。可能您事先不知道正确的集群数量,那么层次聚类是一个不错的选择。 K-means 不允许自定义指标,但有一些 K-means 的修改(如 K-medoids)

困难的部分是定义两条轨迹(时间序列)之间的距离。常用的方法是 DTW(动态时间规整)。为了提高性能,您可以通过更少量的点(许多算法)来近似您的轨迹。

【讨论】:

-1 :如果您定义自定义指标,则不能使用 K-means。 K-means 仅针对 euclian 度量定义良好。 K-medoids 或核化 k-means 可以克服这一限制,但代价是额外的计算资源。 现在答案不一致,只需删除“如果您定义一个指标,那么每个聚类算法都是可行的”的部分,而不是在最后添加说明。这对读者来说会更有价值。 其实没有。有些聚类算法不需要度量。例如。酷猫。如果用户愿意为他的问题选择一个合适的距离,那么那些可以使用任意距离(大多数不需要度量,只是相异)的方法会更加灵活。 @Anony Mousse 在明确区分 metricdissimilarity 方面有一个很好的观点。这也可能是使用伪内核(不引入内核度量)的聚类方法以及基于某些模型/分布拟合的聚类方法的情况,在这种情况下,我们不关心 distance 的任何概念i> 在数据之间,我们更愿意测量来自某个参数化模型(不仅仅是输入空间中的一个点)的概率。【参考方案3】:

两者都行不通。因为这里什么是正确的意思

了解基于距离的聚类方法,例如层次聚类(适用于小型数据集,但您可能没有数千条轨迹)和 DBSCAN。

那么你只需要选择一个合适的距离函数,例如轨迹的时间和空间分辨率差异。

动态时间规整 (DTW) 距离 等距离函数可以满足这一要求。

【讨论】:

您可以使用带有 DTW 的 K-Means 作为距离度量(以确定相似性)并使用 DBA 计算每次迭代中的质心,这是一种在使用 DTW 时平均不同时间序列的新方法一个指标。 cs.ucr.edu/~eamonn/ICDM_2014_DTW_average.pdf【参考方案4】:

这是一个很好的概念,并且有可能用于实时应用。在我看来,可以采用任何聚类但需要选择适当的相异性度量,稍后需要考虑计算复杂度。 论文 (http://link.springer.com/chapter/10.1007/978-81-8489-203-1_15) 使用 Hausdorff 并提出了降低复杂性的技术,论文 (http://www.cit.iit.bas.bg/CIT_2015/v-15-2/4-5-TCMVS%20A-edited-md-Gotovop.pdf) 描述了“基于多视图相似性的轨迹聚类技术”的使用

【讨论】:

以上是关于轨迹聚类:哪种聚类方法?的主要内容,如果未能解决你的问题,请参考以下文章

三种聚类方法:层次、K均值、密度

如何用Python对人员轨迹聚类

四种聚类方法之比较

在不知道 k 的情况下,哪种聚类算法适用于一维 Lists?

R语言确定聚类的最佳簇数:3种聚类优化方法

K均值聚类法和系统聚类法有啥区别,这两种聚类方法的适用条件都是啥?