我在3D空间中有以下几点:
根据D_max
和d_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指出的那样,DBSCAN和HDBSCAN clustering模块看起来非常适合这类问题。但是,正如@Paul所指出的,他们缺少与我的D_max
参数相关的群集最大大小的选项。我不确定如何为DBSCAN和HDBSCAN群集添加最大群集大小功能。
感谢@ Anony-Mousse我看了Agglomerative Clustering: how it works和Hierarchical Clustering 3: single-link vs. complete-link我正在研究Comparing Python Clustering Algorithms,我觉得这些算法的工作方式越来越清晰。
答案 0 :(得分:2)
根据要求,我的评论作为答案:
您可以使用DBSCAN(http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html)或HDBSCAN。
这两种算法都允许根据d_max(同一数据集的2个点之间的最大距离)对每个点进行分组,但它们不会采用最大的簇大小。限制群集最大大小的唯一方法是减少eps
参数,该参数控制同一群集中2个点之间的最大距离。
答案 1 :(得分:2)
使用分层凝聚聚类。
如果使用完整链接,则可以控制群集的最大直径。完整链接是最大距离。
DBSCAN的epsilon参数不最大距离,因为多个步骤是可传递的。集群可以变得比epsilon大得多!
答案 2 :(得分:0)
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)