【问题标题】:Merging of clusters集群合并
【发布时间】:2018-05-26 19:01:03
【问题描述】:

我有一个矩阵,可以分组描述对象。

n <- 6 # number of objects
group <- matrix(c(1,2,1,4,1,3,6,3,5,3,NA,NA,2,NA,2,NA,NA,6,NA,6,NA,NA,NA,NA,4,NA,NA,NA,NA,5),5,6)
colnames(group) <- colnames(group, do.NULL = FALSE, prefix = "obj.")
rownames(group) <- rownames(group, do.NULL = FALSE, prefix = "step.")
group #  an n-1 by n matrix
#        obj.1 obj.2 obj.3 obj.4 obj.5 obj.6
# step.1     1     3    NA    NA    NA    NA
# step.2     2     6    NA    NA    NA    NA
# step.3     1     3     2     6    NA    NA
# step.4     4     5    NA    NA    NA    NA
# step.5     1     3     2     6     4     5

我想创建一个在步骤中合并集群的矩阵。该矩阵等于 hclust 函数中返回的对象合并。

merge <- matrix(c(-1, -2, 1, -4, 3, -3, -6, 2, -5, 4), 5, 2)
merge
#      [,1] [,2]
# [1,]   -1   -3
# [2,]   -2   -6
# [3,]    1    2
# [4,]   -4   -5
# [5,]    3    4

merge 是一个 n-1 x 2 矩阵。合并的第 i 行描述了聚类步骤 i 中聚类的合并。如果行中的元素 j 为负数,则在此阶段合并观察 -j。如果 j 为正,则合并是在算法的(早期)阶段 j 形成的集群。因此,merge 中的负数表示单例的聚集,正数表示非单例的聚集。

我还没有找到一个简单的解决方案。这个有什么功能吗?

【问题讨论】:

    标签: r plot cluster-analysis


    【解决方案1】:

    基本上你有一组组(每行一个)...

    group
    #        obj.1 obj.2 obj.3 obj.4 obj.5 obj.6
    # step.1     1     3    NA    NA    NA    NA
    # step.2     2     6    NA    NA    NA    NA
    # step.3     1     3     2     6    NA    NA
    # step.4     4     5    NA    NA    NA    NA
    # step.5     1     3     2     6     4     5
    

    ...并且您想知道前两行合并形成当前行。

    我将首先创建一个矩阵来指示每个对象是否在特定行中:

    (hasObs <- sapply(seq_len(ncol(group)), function(i) rowSums(!is.na(group) & group == i)))
    #        [,1] [,2] [,3] [,4] [,5] [,6]
    # step.1    1    0    1    0    0    0
    # step.2    0    1    0    0    0    1
    # step.3    1    1    1    0    0    1
    # step.4    0    0    0    1    1    0
    # step.5    1    1    1    1    1    1
    

    我会用它来创建一个矩阵,其中每个元素 (i,j) 表示 j 出现的最近的前一行(在 i 之前)(如果没有这样的前一行,则为 -j):

    (prevObs <- sapply(seq_len(ncol(hasObs)), function(i) {
      pos <- which(head(hasObs, -1)[,i] == 1)
      rep(c(-i, pos), diff(c(0, pos, nrow(hasObs))))
    }))
    #        [,1] [,2] [,3] [,4] [,5] [,6]
    #          -1   -2   -3   -4   -5   -6
    # step.1    1   -2    1   -4   -5   -6
    # step.1    1    2    1   -4   -5    2
    # step.3    3    3    3   -4   -5    3
    # step.3    3    3    3    4    4    3
    

    现在很容易确定合并了哪些行以构成当前行:

    t(apply(hasObs*prevObs, 1, function(x) unique(x[x != 0])))
    #        [,1] [,2]
    # step.1   -1   -3
    # step.2   -2   -6
    # step.3    1    2
    # step.4   -4   -5
    # step.5    3    4
    

    第一行组合了单个元素 1 和 3,接下来组合了单个元素 2 和 6,第三行组合了前两组,第四行组合了单个元素 4 和 5,第五行组合了第 3 行和第 3 行的组4.

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2020-03-21
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多