r - 基于成对距离的聚类组
问题描述
我有一个以成对距离作为条目的 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)
谢谢!
解决方案
欢迎来到 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
推荐阅读
- firebase - Firestore:存储由外部源生成的单调递增的 ID
- sql - 将第一行十进制值添加到 SQL Server 中的下一行
- performance - SQLITE 使用事务更新很慢,而 INSERT 很快
- python - 计算数字中的数字
- javascript - 如何将输入表单中的文本移动到 div
- sql-server - 在 Management Studio 上更改另一个版本的 SQL Server
- php - Wordpress 从主题中删除插件过滤器
- mongodb - MongoDB - 根据其属性查找最匹配的文档
- laravel - Laravel 6:在一对多关系上选择不同
- java - 在多个 Java 实例中更改变量