【问题标题】:Group geometry points according to spatial proximity根据空间接近度对几何点进行分组
【发布时间】:2018-11-02 03:52:53
【问题描述】:

我在3D空间有以下几点:

我需要根据D_maxd_max 对点进行分组

D_max = max dimension of each group
d_max = max distance of points inside each group

像这样:

上图中组的形状看起来像一个盒子,但形状可以是分组算法输出的任何形状。


我正在使用 Python 并使用 Blender 可视化结果。我正在考虑使用scipy.spatial.KDTree 并调用它的query API,但是,我不确定这是否是适合手头工作的工具。我担心可能有一个我不知道的更好的工具。我很想知道是否有任何其他工具/库/算法可以帮助我。


正如@CoMartel 指出的,有DBSCANHDBSCAN clustering 模块看起来很适合这类问题。但是,正如@Paul 所指出的,他们缺少与我的D_max 参数相关的集群最大大小的选项。我不确定如何向 DBSCAN 和 HDBSCAN 集群添加最大集群大小功能。


感谢@Anony-Mousse,我观看了Agglomerative Clustering: how it worksHierarchical Clustering 3: single-link vs. complete-link,并且正在研究Comparing Python Clustering Algorithms,我觉得这些算法的工作原理越来越清楚了。

【问题讨论】:

  • 看起来 DBScan 可以做得更好:scikit-learn.org/stable/modules/generated/…
  • 还有一个叫做 HDBScan 的衍生产品,有一些差异可能对你有好处
  • DBScan 只考虑d_max 而不是D_max(保持这篇文章的说法)。另外,我不确定 DBScan 的效果如何,因为大多数点似乎都在网格上,因此大多数最近的邻居将同样远。
  • 如果你先应用 DBSCAN,集群内点的最大距离是多少(我们称之为D)?这与您的目标D_max 相比如何?您可能会发现目前D >> D_max,在这种情况下,您可能只想使用 DBSCAN 对您的点进行预聚类,然后使用其他算法对这些聚类进行分区以强制执行您的D_max 标准(在我看来,这确实是更多的是packaging problem,而不是聚类问题)。
  • @CoMartel 您能否在 DBSCAN 和 HDBSCAN 上发布您的 cmets 作为答案,以便我可以接受并关闭已回答的问题。您对这两种算法的建议实际上解决了我的问题。

标签: python scikit-learn cluster-analysis dbscan


【解决方案1】:

根据要求,我的评论作为答案:

您可以使用 DBSCAN(http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html) 或 HDBSCAN。

这两种算法都允许根据 d_max(同一数据集的 2 个点之间的最大距离)对每个点进行分组,但它们不采用最大聚类大小。限制集群最大大小的唯一方法是减小eps参数,该参数控制同一集群的2个点之间的最大距离。

【讨论】:

  • 看来我还不清楚:DBSCAN 确实不允许控制组大小,但是通过更改 eps 参数,它将更改 2 点之间的最大距离和(因此),更改组大小。但是,是的,这并不是您所需要的。
【解决方案2】:

使用分层凝聚聚类

如果您使用完整链接,您可以控制簇的最大直径。完整的链接是最大距离。

DBSCAN 的 epsilon 参数不是最大距离,因为多个步骤是可传递连接的。集群可以变得比 epsilon 大得多!

【讨论】:

【解决方案3】:

每个组扩展内点距离最大的DBSCAN聚类算法

您可以递归地使用 DBSCAN 算法。

def DBSCAN_with_max_size(myData, eps = E, max_size = S):
     clusters = DBSCAN(myData, eps = E)
     Big_Clusters = find_big_clusters(clusters)
     for big_cluster in Big_Clusters:
         DBSCAN_with_max_size(big_cluster ,eps = E/2 ,max_size = S) //eps is something lower than E (e.g. E/2)

【讨论】:

  • 谢谢!我试试看☺
猜你喜欢
  • 2011-05-19
  • 2014-03-15
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多