从树中的聚类对象逐步绘制树状图的算法

Posted

技术标签:

【中文标题】从树中的聚类对象逐步绘制树状图的算法【英文标题】:algorithm for drawing dendrogram stepwise from clustered objects in a tree 【发布时间】:2012-06-27 01:29:30 【问题描述】:

我想从我已经聚集并保存在(离开)树中的对象中绘制树状图。我在 Java 中的 Cluster 对象可以用这些图片来表示。每个叶子包含一个对象,每个节点包含其子节点之间的距离。

现在,我想逐步绘制树状图,因此首先应绘制对象 1 和 2,然后应将对象 3 添加到其中。然后 5 和 6 一起等......直到一切都连接起来。我已经拥有所有工具来轻松绘制它,但我找不到正确穿过树的有效方法。

这应该是示例中到目前为止的结果(编辑:有一个错误,从 5 到 6 的距离现在看起来小于从 3 到 1&2 的距离,但在我的示例中并非如此!):

有人对这种递归算法有一些提示吗?

【问题讨论】:

【参考方案1】:

您首先渲染深度 - 您可能会发现您需要跟踪深度以使布局正常工作 - 还要注意您还必须绘制非终端注释(“*”在 3 之前绘制)

基本上

draw(node)

   if(hasleft) draw(left)
   if(hasright) draw(right)
   drawme()

这确实假设了一棵二叉树,但这就是您绘制的内容-由于布局问题,这将变得更加复杂-您真的想首先考虑从上到下绘制宽度,它使布局少了很多痛苦

【讨论】:

对于大纲部分,我认为从底部开始更容易(我知道我必须从添加图片中的标签旁边开始)。这棵树并不完全是一棵二叉搜索树,即两棵树可以再次聚集成一棵树,那么我认为它不再是了吗? 啊,改变布局会让事情变得更容易,但并不完美 - 但是如果你从不打算标记终端节点以外的任何东西,这相当简单 - 但第一个布局要好得多 - 你是正确的,第二个图不是二叉树,因为根元素有 4 个子元素 - 但是请注意,对于任何父行,您需要知道子元素的总数才能计算父 lint 的垂直偏移量 我不确定你是不是这个意思,但第一张图片不是布局,它只是用我的 Java 中的树类绘制的视觉表示,其中包含一些数据,以便清楚我的集群对象是什么样的。

以上是关于从树中的聚类对象逐步绘制树状图的算法的主要内容,如果未能解决你的问题,请参考以下文章

基于密度的聚类方法

基于位置信息的聚类算法介绍及模型选择

利用谱聚类算法解决非完全图的聚类

使用树状图可视化聚类

机器学习聚类算法总结

K均值聚类算法