【发布时间】:2012-10-10 06:35:18
【问题描述】:
我正在使用层次聚类来尝试可视化已扁平化为二维的大量数据。我想要做的是创建一个可视化,允许我通过将集群渲染为其组成点的凸包来查看层次结构中不同高度的数据。这个问题最难的部分是我需要一种算法,当我向上移动时,它可以有效地合并对集群的凸包。我已经看到了很多用于在 O(n log n) 时间内计算点的凸包的算法,但是在这种情况下,利用问题的子结构似乎会更有效率,但我不完全确定如何。
编辑:
有关更多信息,数据结构是一个数组,它以聚类的原始点开始,然后表示将哪些点/聚类组合起来形成下一个聚类。所以它有点像树/指针结构,但包含在一个大数组中。重要的部分是,查看任何超级集群的两个组成集群是有效的,但获取属于集群的所有点的集合并不高效。所以任何合理的算法都必须自下而上地工作。
假设我们位于层次结构的中间某个地方,预先计算的层次结构表明集群 A 和 B 合并生成集群 C。我们从下往上进行,所以我们已经计算了凸集群 A 和 B 中的点的外壳,因此我们只需将它们组合起来即可生成集群 C 的凸包。集群 A 的凸包实际上可以是一个点、一对或一个完整的多边形。集群 B 也是如此。因此,有几种情况应该如何合并这些以形成集群 C 的凸包,但我敢打赌,有一个聪明的解决方案可能会将单例和对以与多边形相同的方式处理。
最明显的解决方案是使用集群 A 和 B 的凸包的组合点集来计算凸包。但我需要在 100k 点的层次结构上执行此操作,所以我想知道是否有一种更有效的方法来组合 A 和 B 的凸包。
编辑 2:
/----5
1---/ / \
/ \ / B 8
2 A 3 C 6 /
\ / \ /
4--------7
好的,所以我尝试用 ASCII 码来说明我的意思。簇A的凸包是1-2-3-4,B的凸包是5-6-7-8,C的凸包是1-2-4-7-8-5。据推测,集群 A 和 B 在它们的外壳内包含额外的点,但这些显然不可能成为 C 外壳的一部分,因此问题在于确定在何处“拼接”集群 A 和 B 的外壳以形成C 的船体,基于点的坐标。这是整个过程的归纳步骤。 (最终 C 将与集群 D 组合,依此类推,直到算法以最顶层的集群结束,该集群将以所有点的凸包作为其凸包)。
【问题讨论】:
-
您能否更详细地解释一下您打算利用什么以及当前的数据结构究竟是怎样的?
-
你能添加一张简单的图片来展示它应该是什么样子吗? (特别是你说“这个问题最困难的部分是我需要一种算法,当我向上移动时,我需要一种算法可以有效地合并对集群的凸包”)
标签: python cluster-analysis computational-geometry convex-hull hierarchical-clustering