使用树状图可视化层次聚类中的最低节点

Cec*_*lia 5 matlab dendrogram

我正在linkage为大约 5000 个实例的数据集生成凝聚层次聚类。我想可视化层次结构中的“底部”合并,即靠近具有最小距离度量的叶子的节点。

不幸的是,dendrogram可视化更喜欢显示算法中最后一次合并的“顶部”节点。默认情况下,它显示前 30 个节点,折叠树的底部。我可以更改P值以显示更多节点,但我必须显示所有 5000+ 才能看到聚类的最低级别,此时绘图不再可读。

MCVE

例如,从linkage文档示例开始

openExample('stats/CompareClusterAssignmentsToClustersExample')
run CompareClusterAssignmentsToClustersExample
dendrogram(Z, 'Orient', 'Left', 'Labels', species);
Run Code Online (Sandbox Code Playgroud)

生成一个树状图,其中前 30 个节点可见。带有数字标签的节点正在折叠树的较低级别。

具有折叠较低级别的树状图

我可以增加可见节点的数量以包含所有叶子,但会牺牲可读性。

dendrogram(Z, size(Z,1), 'Orient', 'Left', 'Labels', species);
Run Code Online (Sandbox Code Playgroud)

所有叶子的树状图

我想要什么

我真正喜欢的是上面的放大版本,如下例所示,但显示前 30 个最近的集群。

放大所有叶子的树状图

我试过的

我尝试提供前 30 行的函数Z

dendrogram(Z(1:30), 'Orient', 'Left');
Run Code Online (Sandbox Code Playgroud)

但这会引发“索引超出矩阵维度”。当其中一行引用行中的集群 > 30 时出错。

我也尝试使用 dendrogramReorder属性,但我很难找到一个有效的排序,从最近到最远对集群进行排序。

%The Z matrix is in order from closest cluster to furthest, 
% so I can use it to create an ordering
Y = reshape(Z(:, 1:2)', 1, [])
Y = Y(Y<151);
dendrogram(Z, 30, 'Orient', 'Left', 'Labels', species, 'Reorder', Y);
Run Code Online (Sandbox Code Playgroud)

我收到错误

在请求的节点排序中,图中属于同一叶子的一些数据点被属于其他叶子的点分开。尝试使用不同的顺序。

如果整个树都被计算,那么这种排序可能是不可能的,因为会有分支交叉,但我希望如果我只查看树的一部分和集群,会有更好的排序不考虑更高级别。

如何改进我的可视化以在树状图中显示最低级别的集群?

X Z*_*ang 1

嗯...像 ylim() 一样?

dendrogram(Z, size(Z,1), 'Orient', 'Left', 'Labels', species);
ylim(max(ylim())-[30,0]);
Run Code Online (Sandbox Code Playgroud)

产量

放大