FormationControlSimulation/SOURCE/networks-toolbox/modularityMetric.m

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