【问题标题】:r dendrogram - groupLabels not match real labels (package dendextend)r dendrogram - groupLabels 与真实标签不匹配(dendextend 包)
【发布时间】:2017-10-26 13:58:49
【问题描述】:

让我们使用 FactoMineR 包对 iris 数据集 进行快速的 3 类分类:

library(FactoMineR)
model <- HCPC(iris[,1:4], nb.clust = 3)
summary(model$data.clust$clust)

 1  2  3
50 62 38

我们看到集群 1 中有 50 个观测值,集群 2 中有 62 个,集群 3 中有 38 个。

现在,我们想在树状图中可视化这 3 个集群,使用包 dendextend 可以制作漂亮的集群:

library(dendextend)
library(dplyr)
model$call$t$tree %>% 
    as.dendrogram() %>% 
    color_branches(k = 3, groupLabels = unique(model$data.clust$clust)) %>% 
    plot()

问题是树状图上的标签不符合分类的真实标签。簇 2 应该是最大的(根据数据有 62 个观测值),但在树状图上,我们清楚地看到它是最小的。

我尝试了不同的想法,但目前没有任何效果,所以如果您知道将哪个输入提供给 groupLabels = 以匹配真实标签,那就太好了。

【问题讨论】:

    标签: r dendrogram dendextend


    【解决方案1】:

    查看dendextend::color_branches 内部,我们可以看到使用命令g &lt;- dendextend::cutree(dend, k = k, h = h, order_clusters_as_data = FALSE) 分配组标签。
    这一事实可用于在HCPC 分配的集群标签和dendextend::color_branches 分配的组标签之间构建映射。

    library(FactoMineR)
    library(dendextend)
    library(dplyr)
    model <- HCPC(iris[,1:4], nb.clust = 3)  
    
    clust.hcpc <- as.numeric(model$data.clust$clust)
    clust.cutree <- dendextend:::cutree(model$call$t$tree, k=3, order_clusters_as_data = FALSE)
    idx <- order(as.numeric(names(clust.cutree)))
    clust.cutree <- clust.cutree[idx]
    ( tbl <- table(clust.hcpc, clust.cutree) )
    
    ###########
              clust.cutree
    clust.hcpc  1  2  3
             1 50  0  0
             2  0  0 62
             3  0 36  2
    

    此表显示集群标签 2 和 3 分别与组标签 3 和 2 匹配。 (令人惊讶的是,对于两个样本单元,此规则不正确。)

    需要传递给dendextend::color_branches的组级别可以找到如下:

    ( lbls <- apply(tbl,2,which.max) )
    
    ##############
    1 2 3 
    1 3 2
    

    这是树状图:

    model$call$t$tree %>% 
        color_branches(k=3, groupLabels =lbls) %>% 
        set("labels_cex", .5) %>% 
        plot(horiz=T) 
    

    【讨论】:

    • 嗨,马可。谢谢。如果您对如何让 dendextend 变得更好有任何建议,请随时发送 PR。
    • 嗨,Marco,在table 上使用which.max 以正确重新排序数字的技巧非常好!谢谢。
    • 是的。关于不遵守规则的两个令人惊讶的样本单元,这是因为 HCPC 函数中的选项 consol = T 进行了一些修改(使用 kmeans 进行集群合并)。
    • @S.Demars 谢谢你的解释!
    • 对于那些需要为标签着色的人,我必须执行以下操作(我使用 res.hcpc 而不是模型):( dend_to_hcpc &lt;- apply(tbl,2,which.max) )( hcpc_to_dend &lt;- apply(tbl, 1, which.max) )dend &lt;- res.hcpc$call$t$tree %&gt;% color_branches(k = res.hcpc$call$t$nb.clust, groupLabels = dend_to_hcpc, col = spectral_colors_array[dend_to_hcpc]) %&gt;% set("labels_cex", 0.5) %&gt;% set("branches_lwd", 3.0)labels_colors(dend) &lt;- spectral_colors_array[dend_to_hcpc[clust.cutree[match(labels(dend), names(clust.cutree))]]]
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多