我有一系列的行数据(2-3个连接点)。 什么是最好的机器学习算法,我可以用来将线路分类到它们的位置相似性? (如下图所示)
最好是python库,例如SciKit-Learn。
修改 我尝试过DBSCAN,但我遇到的问题是如果有两条线相互交叉,有时DBSCAN会将它们视为一组,即使它们完全处于不同的方向。
这是我到目前为止找到的解决方案:
GeoPath聚类算法
这里的想法是将彼此非常相似的地理路径聚类成组。
步骤:
1-基于斜率的聚类线
2-在步骤1的每个群集中,找到行的中心点并使用k-mean 算法将它们聚类成更小的组
3-在步骤2的每个geoup中,计算每行的长度和定义长度阈值内的组线
结果将是具有相似斜率,彼此接近且具有相似行程距离的小组线。
答案 0 :(得分:2)
我会回答一个问题,因为我觉得现在的答案是不完整的...而且我也认为#34;简单启发式的评论"为时过早。我认为如果你在点上聚类,你会得到与你的图表描绘的结果不同的结果。由于集群将靠近终点,你不会得到你的椭圆。
因此,如果您的数据确实与您的显示方式相似。我会尝试将每组2/3点变成一个更长的点列表,基本上可以找出这些线。 (你需要试验密度)
然后在结果上运行HDBSCAN,看视频(https://www.youtube.com/watch?v=AgPQ76RIi6A)以获取群集。我相信" pip install hdbscan"安装它。
现在,在测试新样本时,首先将其分解为多个(N)点并将其与hdbscan模型拟合。我认为如果你采用多数投票方式获得N分,那么你将获得最好的整体集群,并且#34;线"所属
所以,虽然我有点同意"简单的启发式"评论,如果你想让整个事情自动化,那就不那么简单了。一旦你观看视频,你可能会相信HDBSCAN,因为它的基于密度的算法,将适合这个问题(如果你决定从每个样本创建许多点)。
我总结说我确定之前有线路交叉模型已经完成了这一点......而且确实存在可以完成这项工作的启发式和规则。可能,它们在计算上也更经济。我的答案只是根据你的要求使用sklearn有机的东西......我甚至没有测试过它!如果我在你的鞋子里,我就会如何继续下去。
修改强>
我戳了一下,你可以尝试一些线相似性测量。 Frechet和Hausdorff距离测量。
Frechet:http://arxiv.org/pdf/1307.6628.pdf Hausdorff:distance matrix of curves in python用于python示例。
如果您生成所有成对的相似性,然后根据相似性和/或N个区域对它们进行分组,那么您可以将这些区域称为“" cluster" (虽然不是kmeans集群!)。对于每个新行,生成所有相似之处并查看它属于哪个bin。我修改了我的原始评论,可能是计算上不那么密集......你很幸运,你的行只有2或3分!
答案 1 :(得分:0)
您尝试解决的问题称为群集。有关sklearn中的聚类算法的概述,请参阅http://scikit-learn.org/stable/modules/clustering.html#clustering。
编辑2: KMeans是我第一次看到您的帖子时想到的,但根据评论的反馈,它看起来不太适合。您可能想要尝试sklearn的DBSCAN。
您可以添加的潜在变换或额外功能是将直线拟合到每组点,然后使用(斜率,截距)对。您可能还想使用每行的质心。