如何在网格上聚集一组 3D 点?

How to cluster a set of 3D points on a grid?

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

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

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

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

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

但是,您的集群规则似乎彼此不兼容:

  1. If point A is at most 1.414 units from B, then they belong in the same cluster and if point C is at most 1.414 units from B or C then it also belongs to that cluster.
  2. If on the other hand, D is more than 1.414 units from either A, B, or C, then it doesn't belong in that cluster and so on.

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

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

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

  1. If on the other hand, D is more than 1.414 units from all A, B, or C, then it doesn't belong in that cluster and so on.

然后您指定了所谓的 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 等等。