如何找到 3D 图形上的连接点?

How can I find connected points on a graph in 3D?

我有一组 1000 多个 x、y 和 z 坐标,我想知道它们是如何聚类的。我想设置一个最大距离,指定点属于同一个集群,即如果该点与另一个点的欧几里得距离小于 1,则该算法会将它们聚集在一起。我试图在 python 上强行执行此操作但收效甚微,有没有人有任何想法或预先建立的算法来做类似的事情?

提前致谢

您可以在模块 scikit-learn 中找到很多聚类算法:https://scikit-learn.org/stable/modules/clustering.html

根据您对集群的特定定义,sklearn.cluster.AgglomerativeClustering(n_clusters=None, distance_threshold=1) 似乎正是您想要的。

import numpy as np
from sklearn.cluster import AgglomerativeClustering

N = 1500
box_size = 10

points = np.random.rand(N, 2) * box_size
# array([[5.93688935, 6.63209391], [2.6182196 , 8.33040083], [4.35061433, 7.21399521], ..., [4.09271753, 2.3614302 ], [5.69176382, 1.78457418], [9.76504841, 1.38935121]])

clustering = AgglomerativeClustering(n_clusters=None, distance_threshold=1).fit(points)

print('Number of clusters:', clustering.n_clusters_)
# Number of clusters: 224

另一种方法是构建一个图,然后获取图的连通分量,例如使用模块 networkx:networkx.algorithms.components.connected_components