线(旅行路径)聚类机器学习算法
Posted
技术标签:
【中文标题】线(旅行路径)聚类机器学习算法【英文标题】:line (travel path) clustering machine learning algorithm [closed] 【发布时间】:2016-12-04 16:17:30 【问题描述】:我有一系列线数据(2-3 个连接点)。 我可以使用哪种机器学习算法将线分类为它们的位置相似性? (下图)
最好使用 Python 库,例如 SciKit-Learn。
编辑: 我试过 DBSCAN,但我遇到的问题是如果有两条线相交,有时 DBSCAN 将它们视为一组,即使它们完全不同的方向。
这是我目前找到的解决方案:
GeoPath 聚类算法
这里的想法是将彼此非常相似的地理路径聚集成组。
步骤:
1- 基于坡度的聚类线
2- 在步骤 1 的每个集群中,找到线的中心并使用 k-mean 算法将它们分成更小的组
3- 在步骤 2 的每个地理区域中,计算每条线的长度并在定义的长度阈值内对线进行分组
结果将是具有相似坡度、彼此靠近且行进距离相似的小线组。
以下是可视化的屏幕截图: 黄色线是所有的线,红色是一起旅行的路径集群。
【问题讨论】:
这实际上叫做聚类。但是对于这样简单的数据,你应该能够写下一个简单的启发式来做到这一点。 【参考方案1】:我会抛出一个答案,因为我认为当前的答案是不完整的......而且我还认为“简单启发式”的评论还为时过早。我认为,如果你对点进行聚类,你会得到与图表所描绘的不同的结果。因为集群将靠近端点,您不会得到漂亮的椭圆。
因此,如果您的数据确实与您的显示方式相似。我会尝试将每组 2/3 点转换为更长的点列表,这些点基本上可以勾勒出线条。 (你需要试验密度)
然后在结果上运行 HDBSCAN 观看视频 (https://www.youtube.com/watch?v=AgPQ76RIi6A) 以获取您的集群。我相信“pip install hdbscan”会安装它。
现在,在测试新样本时,首先将其分解为许多 (N) 个点,然后将它们与您的 hdbscan 模型相匹配。我认为,如果您对 N 点采取多数投票法,您将获得“线”所属的最佳整体集群。
所以,虽然我有点同意“简单启发式”的评论,但如果你想让整个事情自动化,那就没那么简单了。观看视频后,您可能会确信 HDBSCAN,由于其基于密度的算法,将适合这个问题(如果您决定从每个样本中创建许多点)。
最后我要说的是,我确信以前有线交叉模型已经做到了这一点......并且确实存在可以完成这项工作的启发式方法和规则。很可能,它们在计算上也更经济。我的回答只是按照您的要求使用 sklearn 进行有机处理......而且我什至没有测试过它!如果我站在你的立场上,这就是我会采取的行动。
编辑
我四处寻找,您可以尝试一些行相似性度量。 Frechet 和 Hausdorff 距离度量。
弗雷切:http://arxiv.org/pdf/1307.6628.pdf Hausdorff:distance matrix of curves in python 用于 python 示例。
如果您生成所有成对的相似性,然后根据相似性和/或将它们分组到 N 个 bin 中,那么您可以将这些 bin 称为您的“集群”(虽然不是 kmeans 集群!)。对于每个新行,生成所有相似性并查看它属于哪个 bin。我修改了我原来的评论,即可能计算量较少......你很幸运,你的行只有 2 或 3 分!
【讨论】:
【参考方案2】:您要解决的问题称为聚类。有关 sklearn 中聚类算法的概述,请参阅http://scikit-learn.org/stable/modules/clustering.html#clustering。
编辑 2:当我第一次看到您的帖子时,我想到了 KMeans,但根据 cmets 的反馈,它看起来不太合适。你可能想试试 sklearn 的 DBSCAN。
您可以添加的潜在转换或额外功能是将直线拟合到每组点,然后使用(斜率,截距)对。您可能还想使用每条线的质心。
【讨论】:
kmeans 并非真正设计用于处理此类非欧几里得空间,您的度量可能类似于两行凸包的体积。然而,考虑到这样的指标,即使是简单的 DBScan 也应该可以正常工作(或其他接受任意指标的集群) 感谢您的反馈。我已经更新了我的答案以反映它。不过,KMeans 可能适用于 OP 发布的数据集。 Kmeans 没有用otu euclidean 度量很好地定义 - 它根本不起作用(当你使用其他度量时它的行为是不明确的,因为对质心取平均值不必降低成本),因此,您甚至可能没有收敛方法。他的数据甚至不是 R^n 空间(因为每一行都是不同长度的点序列)。他必须固定点的数量,然后使用欧式距离,k-means会收敛,但是这样的聚类是没有意义的(端点之间的欧式距离没有捕捉到“直线距离”) 他的线条被定义为两个或三个点的序列。他可以将这些单独的点输入到 KMeans 中,这适用于他发布的数据集。如果将属于同一条线的点放在不同的集群中,则潜在的问题是。 集群端点没有任何意义(即使在提供的示例中,您最终会在不同集群中获得部分行;这将是一种常见的情况,因为任何长行都会被拆分)以上是关于线(旅行路径)聚类机器学习算法的主要内容,如果未能解决你的问题,请参考以下文章