首页 > 解决方案 > 基于成对距离的聚类组

问题描述

我有一个以成对距离作为条目的 nxn 矩阵。矩阵看起来像这样:

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)

(四)

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

clustersizes = c(3,2,1)

我认为可以通过使用 hclust 函数,但我无法提取三个集群。我也尝试了cutree函数,但是如果我不知道之前的簇数,也不知道高度的截止值,我该怎么做?

这是我尝试过的:

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

谢谢!

标签: r

解决方案


欢迎来到 SO。

有几种方法可以处理这个问题,但一个简单的选择是使用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 

推荐阅读