R中的Louvain社区检测使用igraph - 分配交替的组成员分配

时间:2018-04-16 11:29:58

标签: r cluster-analysis igraph

我一直在使用igraph,with thanks to this answer for my previous query.在R中运行Louvain社区检测但是,我发现cluster_louvain方法在分配组成员身份时似乎做了一些奇怪的事情,我认为这是由于错误在我如何导入我的数据。虽然我认为我解决了这个问题,但我想了解问题所在。

我在400x400相关矩阵上运行了louvain聚类(即400个人的相关分数)。当我最初导入我的数据时,我的相关矩阵具有与行标题和列标题相同的个人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中提供)。

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号码旁边获取群集号码,以了解属于每个社区的个人。所以我使用了IDs_cluster <- cbind(V(G2)$name, clusterlouvain$membership)。这给出了顶点ID列表,但旁边的成员资格被列为“1 2 1 2 1 2 1 2”,这显然是不对的(因为我们不希望数据集中的每个替代个体被分配到不同的社区):

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

我的问题是:是否可以澄清使用相同的行标题和列标题时发生的情况,这意味着将组成员身份分配给其他人(即“1 2 1 2” ID列表,如第一个示例中所示),但在将列标题更改为非数字格式时已解决(如第二个示例中所示)?

这可能是一个简单的错误,因为当使用'read.csv'导入相关矩阵的.csv时,我没有使用正确的设置,因为我的列标题也是数字。

但是,想要理解为什么这意味着'cluster_louvain'以它的方式分配了组成员身份。我发布这个以防万一有人犯了我上面做的同样的错误。任何见解都会受到欢迎,谢谢您的任何建议!

0 个答案:

没有答案