我一直在使用 igraph 在 R 中运行 Louvain 社区检测,感谢我之前查询的这个答案。 https://stackoverflow.com/questions/49834827/louvain-community-detection-in-r-using-igraph-format-of-edges-and-vertices/49842663#49842663然而,我发现cluster_louvain
方法似乎在分配组成员身份方面做了一些奇怪的事情,我认为这是由于我导入数据的方式出现错误。虽然我认为我解决了这个问题,但我想了解问题是什么。
我在 400x400 相关矩阵(即 400 个人的相关得分)上运行了 Louvain 聚类。当我最初导入数据时,我的相关矩阵的行标题和列标题具有相同的个人 ID 号(即顶点号),如下所示:
1 2 3 4 ... 400
1 0 0.8 0.7 0.1
2 0.8 0 0.6 0.3
3 0.7 0.6 0 0.9
4 0.1 0.3 0.9 0
...
400
该相关矩阵保存在“Correlations.csv”文件中,我使用该文件导入read.csv
。然后,我使用下面的代码将其转换为距离矩阵,删除低于特定阈值的相关性,将其转换为 igraph 的邻接矩阵,然后运行 cluster_louvain:(答案中也提供了此代码here https://stackoverflow.com/questions/49834827/louvain-community-detection-in-r-using-igraph-format-of-edges-and-vertices/49842663#49842663).
correlationmatrix <- read.csv("Correlations.csv", header = TRUE,
row.name = 1, check.names = FALSE)
distancematrix <- cor2dist(correlationmatrix)
DM2<- as.matrix(distancematrix)
DM2[correlationmatrix < 0.33] = 0
G2 <- graph.adjacency(DM2, mode = "undirected", weighted = TRUE, diag = TRUE)
clusterlouvain <- cluster_louvain(G2)
sizes(clusterlouvain)
Community sizes
1 2
200 200
然后我想获取每个 ID 号旁边的簇号,以了解哪个个体属于每个社区。在顶点 ID 列表中,它们旁边的成员资格被列为“1 2 1 2 1 2 1 2”,这显然是不正确的(因为我们不希望数据集中的每个替代个体都被分配到不同的社区):
IDs_cluster <- cbind(V(G2)$name, clusterlouvain$membership)
IDs_cluster
ID Membership
1 1
2 2
3 1
4 2
5 1
6 2
…
400 2
通过查看其他数据集,我意识到问题可能是因为相关矩阵中的行标题是数字。所以我更改了相关矩阵,使行标题仍然是 ID 号,但列标题是“V1-V400”:
V1 V2 V3 V4 ... V400
1 0 0.8 0.7 0.1
2 0.8 0 0.6 0.3
3 0.7 0.6 0 0.9
4 0.1 0.3 0.9 0
...
40
我将其导入为 .csv 文件并重新运行“cluster_louvain”,如下所示:
correlationmatrix_V <- read.csv("Correlations_withV.csv", header = TRUE,
row.name = 1, check.names = FALSE)
distancematrix_V <- cor2dist(correlationmatrix_V)
DM2_V <- as.matrix(distancematrix_V)
DM2_V[correlationmatrix_V < 0.33] = 0
G2_V <- graph.adjacency(DM2_V, mode = "undirected", weighted = TRUE, diag = TRUE)
clusterlouvain_V <- cluster_louvain(G2_V)
现在当我重新运行时cluster_louvain
,它生成了三个集群的更合理的结果,每个集群的组成员资格看起来更像我们所期望的:
sizes(clusterlouvain_V)
Community sizes
1 2 3
168 52 180
IDs_cluster <- cbind(V(G2_V)$name, clusterlouvain_V$membership)
View(IDs_cluster)
ID Membership
1 1
2 1
3 3
4 2
5 2
6 2
…
400 1
我的问题是:是否可以澄清使用相同的行和列标题时发生的情况,这意味着组成员资格被分配给备用个人(即 ID 列表中的“1 2 1 2”,如第一个示例中所示),但在以下情况下得到解决:将列标题更改为非数字格式(如第二个示例中所示)?
这可能是一个简单的错误,因为当使用“read.csv”导入相关矩阵的 .csv 时,我没有使用正确的设置,因为我的列标题也是数字。
但是,我想了解为什么这意味着“cluster_louvain”以这种方式分配组成员资格。我发布这篇文章是为了如果有人犯了我上面犯的同样的错误,它可能会有用。欢迎任何见解,感谢您的建议!