56 lines
1.6 KiB
Matlab
56 lines
1.6 KiB
Matlab
% Computing the modularity for a given module/commnunity partition.
|
|
% Defined as: Q=sum_over_modules_i (eii-ai^2) (eq 5) in Newman and Girvan.
|
|
% eij = fraction of edges that connect community i to community j, ai=sum_j (eij)
|
|
%
|
|
% Source: Newman, Girvan, "Finding and evaluating community structure in networks"
|
|
% Newman, "Fast algorithm for detecting community structure in networks"
|
|
%
|
|
% INPUTs: adjacency matrix, nxn
|
|
% set of modules as cell array of vectors, ex: {[1,2,3],[4,5,6]}
|
|
% OUTPUTs: modularity metric, in [-1,1]
|
|
%
|
|
% Note: This computation makes sense for undirected graphs only.
|
|
% Other functions used: numEdges.m
|
|
% GB: last updated, October 16, 2012
|
|
|
|
function Q=modularityMetric(modules,adj)
|
|
|
|
nedges=numEdges(adj); % total number of edges
|
|
|
|
Q = 0;
|
|
for m=1:length(modules)
|
|
|
|
e_mm=numEdges(adj(modules{m},modules{m}))/nedges;
|
|
a_m=sum(sum(adj(:,modules{m})))/nedges - e_mm;
|
|
Q = Q + (e_mm - a_m^2);
|
|
|
|
end
|
|
|
|
|
|
% % alternative: Q = sum_ij { 1/2m [Aij-kikj/2m]delta(ci,cj) } =
|
|
% % = sum_ij Aij/2m delta(ci,cj) - sum_ij kikj/4m^2 delta(ci,cj) =
|
|
% % = sum_modules e_cc - sum_modules (kikj/4m^2) =
|
|
% % = sum_modules (e_cc - ((sum_i ki)/2m)^2)
|
|
%
|
|
% n = numNodes(adj);
|
|
% m = numEdges(adj);
|
|
%
|
|
% % define the inverse of modules: node "i" <- module "c" if "i" in module "c"
|
|
% mod={};
|
|
% for mm=1:length(modules)
|
|
% for ii=1:length(modules{mm})
|
|
% mod{modules{mm}(ii)}=modules{mm};
|
|
% end
|
|
% end
|
|
%
|
|
% Q = 0;
|
|
%
|
|
% for i=1:n
|
|
% for j=1:n
|
|
%
|
|
% if not(isequal(mod(i),mod(j))); continue; end
|
|
%
|
|
% Q = Q + (adj(i,j) - sum(adj(i,:))*sum(adj(j,:))/(2*m))/(2*m);
|
|
%
|
|
% end
|
|
% end |