Значения Лувена и модульности одного и того же графа сильно отличаются в igraph против networkx - PullRequest
0 голосов
/ 29 марта 2020

У меня есть график, и я хочу оценить модульность (Q) на основе разбивки графика Лувена.

В python я использовал igraph и для сравнения я также оценил Q в Matlab. Основанный на igraph, Q является отрицательным (странным), тогда как Q, основанный на оценке Matlab, является положительным.

Я бы ожидал различий в значениях, но не до сих пор (+ показывает модульность, - показывает антимодульность ). Любая идея, почему это происходит?

Мой код и данные (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 (Brain Connectivity Toolbox) с использованием 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.

1 Ответ

1 голос
/ 29 марта 2020

Решение найдено.

Я ожидал, что igraph поймет это, поскольку определил взвешенную матрицу смежности, но мне нужно явно передать аргумент weights в modularity().

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
...