如何从 MATLAB 中的树状图中查找祖先节点和父节点

How to find the ancestor and parent nodes from a dendrogram in MATLAB

我有来自 MATLAB 中 linkage 算法的输出 Z。

输出 Z 的结构在此 link https://uk.mathworks.com/help/stats/linkage.html(向下滚动到输出)

我正在尝试查找树状图的内部节点和叶子的谱系。谱系定义为连接叶 i(内部节点 α_h)和根 α_1 的有序内部节点集。我还希望能够找到父节点 - 这是 v 的节点 w,其中 w 在从根到 v 的路径上紧跟在 v 之前。有人愿意解释我如何使用 MATLAB 做到这一点吗?

如果我的定义不够清楚,图中显示了一个示例。

叶子3的系谱为G(3)={α_7,α_2,α_1},内部节点α_7的系谱为G(α_7)={α_7,α_2,α_1}。父节点的例子:α_7的父节点是α_2,记为g(α_2)=α_7。我知道给定层次聚类的输出 Z 的树索引与图像不同,因此与树状图由 Z 索引的方式一致的代码绝对没问题。我只关心树状图的输出是否正确。

我希望现在我希望代码使用 Z 的输入查找和执行的操作更加清楚。非常感谢您的帮助!

一个小例子让事情更清楚:

X = [1,2,4,5,8]';    
D = pdist(X);
L = linkage(D, 'ward');
dendrogram(L, 'labels', cellfun(@num2str, num2cell(X), 'uniform', false));

如果您使用

向 L 添加第四列
L(:, end+1) = (size(L, 1) + (1 : size(L, 1)));

然后 L 的每一行都有条目 ["number of node"、"number of node"、"merge at level"、"number of parent"]。

所以根节点总是L(end, end),叶子节点的个数最大为size(X, 1),内部节点的个数大于size(X, 1)。

在您的示例中,L 大致如下所示:

L = [...
    9, 10, 1, 10; % 10 = alpha_9
    5,  6, 2, 11; % 11 = alpha_8
    3,  4, 3, 12; % 12 = alpha_7
    1,  2, 4, 13; % 13 = alpha_6
    7, 12, 5, 14; % 14 = alpha_5
    8, 15, 6, 15; % 15 = alpha_4
   16, 11, 7, 16; % 16 = alpha_3
   14, 13, 8, 17; % 17 = alpha_2
   18, 17, 9, 18; % 18 = alpha_1
   ];
dendrogram(L);

请注意,标签在结构上已经是正确的。