【问题标题】:How to cluster a set of 3D points on a grid?如何在网格上聚类一组 3D 点?
【发布时间】:2021-09-15 00:47:25
【问题描述】:

我在网格上有一组 3D 点,我想知道如何对它们进行聚类,以使给定聚类中的每个点与该聚类中的至少一个点至多有一定的距离(欧几里得距离)。

例如,假设有 5 个点:{A, B, C, D, E}。如果点A距离B最多1.414个单位,那么它们属于同一个簇,如果点C距离AB最多1.414个单位,那么它也属于那个簇.另一方面,如果 DABC 之间的距离超过 1.414 个单位,则它不属于该集群,依此类推。

输入数据可以找到here.
我需要的输出是每个集群的大小、每个集群的中心(质心)以及特定集群中的哪些点。

虽然这不是严格意义上的聚类问题,但我尝试了 k-means、DBSCAN 聚类方法,但无法获得最佳结果。
关于如何进行的任何想法?

【问题讨论】:

    标签: python numpy scikit-learn scipy cluster-analysis


    【解决方案1】:

    使用hierarchical clustering 可以为您提供更高程度的控制,尽管它可能比大型数据集的其他方法慢。

    但是,您的聚类规则似乎彼此不兼容:

    1. 如果点 A 距离 B 最多 1.414 个单位,那么它们属于同一个集群,如果点 C 距离 B 或 C 最多 1.414 个单位,那么它也属于该集群。
    2. 另一方面,如果 D 与 A、B 或 C 的距离超过 1.414 个单位,则它不属于该集群,依此类推。

    例如,在 1D 中,点 [1,2,3] 属于同一个簇,根据规则 1。点 [2,3,4] 也将在同一个簇中。

    但是,根据规则 2,点 [1,2,3,4] 不会属于同一个簇,而点 2 和 3 属于簇 [1,2,3][2,3,4]

    如果您将第二条规则改写为

    1. 另一方面,如果 D 与 所有 A、B 或 C 的距离超过 1.414 个单位,则它不属于该集群,依此类推。

    然后您指定所谓的single linkage method,您可以像这样使用它:

    >>> X = [[0, 0], [0, 1], [1, 0],
             [0, 4], [0, 3], [1, 4],
             [4, 0], [3, 0], [4, 1],
             [4, 4], [3, 4], [4, 3]]
    >>> from scipy.cluster.hierarchy import fcluster, single
    >>> from scipy.spatial.distance import pdist
    >>> y = pdist(X)
    >>> Z = single(y)
    >>> fcluster(Z, 1.414, criterion='distance')
    [3 3 3 4 4 4 2 2 2 1 1 1]
    

    意思是[0,1,2]形成簇3,点[3,4,5]形成簇4等等。

    【讨论】:

      猜你喜欢
      • 2018-01-22
      • 2015-12-09
      • 2013-09-08
      • 2013-11-20
      • 2014-06-23
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2021-11-22
      相关资源
      最近更新 更多