基于成对距离的聚类组

时间:2019-08-22 14:57:31

标签: r

我有一个成对间隔的n x n矩阵作为输入。矩阵看起来像这样:

m = matrix (c(0, 0, 1, 1, 1, 1,0, 0, 1, 1, 0, 1,1, 1, 0, 1, 1, 0,1, 1, 1, 0, 1, 1,1, 0, 1, 1, 0, 1,1, 1, 0, 1, 1, 0),ncol=6, byrow=TRUE)
colnames(m) <- c("A","B","C","D","E","F")
rownames(m) <- c("A","B","C","D","E","F")

现在,如果与其他任何字母的距离为0,我想将每个字母都放在同一簇中。对于上面的示例,我应该得到三个簇,分别是:

(A,B,E)

(C,F)

(D)

我会对每个群集中的条目数感兴趣。最后,我想要一个像这样的向量:

clustersizes = c(3,2,1)

我认为可以通过使用hclust函数来实现,但是我无法提取这三个簇。我也尝试过cutree函数,但是如果我之前不知道簇数,也不知道高度的截止点,该怎么办?

这是我尝试的:

h <- hclust(dist(m),method="single")
plot(h) 

谢谢!

1 个答案:

答案 0 :(得分:1)

欢迎来到。

有几种方法可以解决此问题,但是一个简单的选择是使用igraph软件包。

首先,我们将您的矩阵m转换为邻接矩阵。它包含到相邻节点的距离,其中0表示没有连接。因此,我们从1中减去矩阵即可得到

mm <- 1 - m  
diag(mm) <- 0 # We don't allow loops

这给

> mm
  A B C D E F
A 0 1 0 0 0 0
B 1 0 0 0 1 0
C 0 0 0 0 0 1
D 0 0 0 0 0 0
E 0 1 0 0 0 0
F 0 0 1 0 0 0

然后我们只需要将其提供给igraph即可计算社区

library("igraph")
fastgreedy.community(as.undirected(graph.adjacency(mm)))

产生

IGRAPH clustering fast greedy, groups: 3, mod: 0.44
+ groups:
  $`1`
  [1] "A" "B" "E"

  $`2`
  [1] "C" "F"

  $`3`
  [1] "D"

现在,如果您保存该结果,则可以立即获得社区规模

res < fastgreedy.community(as.undirected(graph.adjacency(mm)))
sizes(res)

产生

Community sizes
1 2 3 
3 2 1