作为机器学习的新手,我有一组不同长度的轨迹。我想把它们聚在一起,因为它们中的一些实际上是同一条路,它们只是因为噪音而看起来不同。
此外,并非所有的长度都相同。所以也许轨迹a和轨迹b是不一样的,但它是轨迹b的一部分,我希望在聚类之后也能给出这个性质。
我对K-means Clustering
和Fuzzy N-means Clustering
只有一点了解。我怎样才能在两者之间做出选择?还是应该采取其他方法?
有没有什么方法能考虑到“归属感”?
(例如,在聚类之后,我有3个聚类A, B and C
。一个特殊的trajectory X
属于cluster A
。较短的trajectory Y
,虽然未在A
中聚集,但被确定为trajectory B
的一部分)
=update=更新======================
前面提到的轨迹是行人的轨迹。它们可以表示为一系列(x, y)
点或一系列阶跃向量(length, direction)
。演示文稿在我的控制之下。
最佳答案
可能有点晚了,但我也在处理同样的问题。
我建议你看看traclus,一个由jae gil lee,jiawei han和kyu young wang创建的算法,发表在sigmod'07上。
http://web.engr.illinois.edu/~hanj/pdf/sigmod07_jglee.pdf
这是迄今为止我所见过的对轨迹进行聚类的最佳方法,因为:
可以发现共同的子轨迹。
关注于段而不是点(因此它过滤掉噪声异常值)。
它在不同长度的轨迹上工作。
基本上是两个阶段的方法:
第一阶段-分区:将轨迹划分成段,这是使用MDL优化的O(n)的复杂性来完成的,其中n是给定轨迹中的点的数目。这里输入是一组轨迹,输出是一组段。
复杂性:O(n),其中n是轨迹上的点的数目
输入:轨迹集。
输出:段集合D
第二阶段-组:这个阶段使用类似于dbscan的基于密度的集群的某个版本来发现集群。该阶段的输入是从第一阶段获得的一组线段,以及构成邻域的一些参数和构成簇的最小行数。输出是一组簇。聚类是在片段上进行的。它们定义自己的距离度量,由3个部分组成:平行距离、垂直距离和角度距离。这个阶段具有O(n log n)的复杂性,其中n是段的数目。
复杂度:O(n log n),其中n是D集合上的段数
输入:段的集合D、设置邻域树的参数E和最小行数的参数minlns。
输出:设置cluster的c,即一个片段簇(轨迹簇)。
最后他们为每个簇计算了一个具有代表性的轨迹,也就是在每个簇中发现的一个共同的子轨迹。
他们有很酷的例子,这篇论文解释得很好。再一次,这不是我的算法,所以如果你在做研究,别忘了引用它们。
附:我根据他们的工作制作了一些幻灯片,只是为了教育目的:
http://www.slideshare.net/ivansanchez1988/trajectory-clustering-traclus-algorithm
关于algorithm - 轨迹聚类:哪种聚类方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18820814/