同一图的 Louvain 和模块化值在 igraph 与 networkx 中有很大差异
Louvain and modularity values of the same graph differ a lot in igraph vs networkx
我有一个图,我想根据图的 Louvain 分裂来估计模块性 (Q)。
在python中我使用了 igraph 并进行比较,我还在 Matlab 中估计了 Q。
基于 igraph,Q 为负(奇怪),而基于 Matlab 估计的 Q 为正。
我预计值会有所不同,但到目前为止还没有(+ 表示模块化,- 表示反模块化)。
知道为什么会这样吗?
我的代码和数据(https://gofile.io/?c=h24mcU):
PYTHON
import numpy as np
import scipy.io
from igraph import *
A = scipy.io.loadmat('A.mat')['A']
graph = Graph.Weighted_Adjacency(A.tolist(), mode=ADJ_UNDIRECTED, attr="weight", loops=False)
Louvain = graph.community_multilevel(weights=graph.es['weight'], return_levels=False)
Q = graph.modularity(Louvain)
print(Q)
-0.001847596203445795
MATLAB(脑连接工具箱)
使用 community_louvain.m:Louvain 社区检测算法
clear all
load('A.mat')
[M,Q]=community_louvain(A);
Q =
0.1466
PYTHON community_louvain.m 的版本: https://github.com/aestrivex/bctpy/blob/f9526a693a9af57051762442d8490dcdf2ebf4e3/bct/algorithms/modularity.py#L71,
import bct
split, Q = bct.community_louvain(A)
Q
0.14659657544165258
我又得到了大约。 0.1466 与 Matlab 和 Python 基于 BCT 的结果相匹配,但与 igraph
输出相差甚远。
已找到解决方案。
我希望 igraph 能够理解这一点,因为我定义了一个加权邻接矩阵,但我需要显式 传递 modularity()
中的 weights
参数。
import numpy as np
import scipy.io
from igraph import *
A = scipy.io.loadmat("A.mat")['A']
np.fill_diagonal(A,0.0)
# igraph
graph = Graph.Weighted_Adjacency(A.tolist(), mode=ADJ_UNDIRECTED, attr="weight", loops=False)
Louvain = graph.community_multilevel(weights=graph.es['weight'], return_levels=False)
Q = graph.modularity(Louvain, weights=graph.es['weight'])
print(Q)
#bctpy
com, q = bct.community_louvain(A)
print(q)
0.14133150351832535
0.14133150351832674
我有一个图,我想根据图的 Louvain 分裂来估计模块性 (Q)。
在python中我使用了 igraph 并进行比较,我还在 Matlab 中估计了 Q。 基于 igraph,Q 为负(奇怪),而基于 Matlab 估计的 Q 为正。
我预计值会有所不同,但到目前为止还没有(+ 表示模块化,- 表示反模块化)。 知道为什么会这样吗?
我的代码和数据(https://gofile.io/?c=h24mcU):
PYTHON
import numpy as np
import scipy.io
from igraph import *
A = scipy.io.loadmat('A.mat')['A']
graph = Graph.Weighted_Adjacency(A.tolist(), mode=ADJ_UNDIRECTED, attr="weight", loops=False)
Louvain = graph.community_multilevel(weights=graph.es['weight'], return_levels=False)
Q = graph.modularity(Louvain)
print(Q)
-0.001847596203445795
MATLAB(脑连接工具箱) 使用 community_louvain.m:Louvain 社区检测算法
clear all
load('A.mat')
[M,Q]=community_louvain(A);
Q =
0.1466
PYTHON community_louvain.m 的版本: https://github.com/aestrivex/bctpy/blob/f9526a693a9af57051762442d8490dcdf2ebf4e3/bct/algorithms/modularity.py#L71,
import bct
split, Q = bct.community_louvain(A)
Q
0.14659657544165258
我又得到了大约。 0.1466 与 Matlab 和 Python 基于 BCT 的结果相匹配,但与 igraph
输出相差甚远。
已找到解决方案。
我希望 igraph 能够理解这一点,因为我定义了一个加权邻接矩阵,但我需要显式 传递 modularity()
中的 weights
参数。
import numpy as np
import scipy.io
from igraph import *
A = scipy.io.loadmat("A.mat")['A']
np.fill_diagonal(A,0.0)
# igraph
graph = Graph.Weighted_Adjacency(A.tolist(), mode=ADJ_UNDIRECTED, attr="weight", loops=False)
Louvain = graph.community_multilevel(weights=graph.es['weight'], return_levels=False)
Q = graph.modularity(Louvain, weights=graph.es['weight'])
print(Q)
#bctpy
com, q = bct.community_louvain(A)
print(q)
0.14133150351832535
0.14133150351832674