如何解决如何在网格上聚类一组 3D 点?
我在网格上有一组 3D 点,我想知道如何对它们进行聚类,以便给定聚类中的每个点至多与该聚类中的至少一个点相距一定的距离(欧几里得距离)。
例如,假设有 5 个点:{A,B,C,D,E}
。如果点A
距B
最多1.414个单位,则它们属于同一个簇,如果点C
距A
或{{1}最多1.414个单位}},那么它也属于该集群。另一方面,如果 B
与 D
、A
或 B
的距离超过 1.414 个单位,则它不属于该集群,依此类推.
输入数据可以在here找到。
我需要的输出是每个集群的大小、每个集群的中心(质心)以及特定集群中的点。
虽然这不是严格意义上的聚类问题,但我尝试过 k-means、DBSCAN 聚类方法,但无法获得最佳结果。
关于如何进行的任何想法?
解决方法
使用 hierarchical clustering 可为您提供更高程度的控制,但对于大型数据集而言,它可能比其他方法慢。
但是,您的聚类规则似乎彼此不兼容:
- 如果 A 点距离 B 最多 1.414 个单位,则它们属于同一个集群;如果点 C 距离 B 或 C 最多 1.414 个单位,则它也属于该集群。
- 另一方面,如果 D 与 A、B 或 C 的距离超过 1.414 个单位,则它不属于该集群,依此类推。
例如,在 1D 中,根据规则 1,点 [1,2,3]
属于同一个簇。而点 [2,3,4]
也将在同一个簇上。
但是,根据规则 2,点 [1,4]
不会属于同一个集群,而点 2 和 3 属于集群 [1,3]
和 [2,4]
。
如果你将第二条规则改写为
- 另一方面,如果 D 与所有 A、B 或 C 的距离超过 1.414 个单位,则它不属于该集群,依此类推。
然后您指定所谓的 single linkage method,您可以像这样使用:
>>> X = [[0,0],[0,1],[1,4],3],[4,[3,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,依此类推。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。