Fast Newman-FN算法以及模塊度定義介紹


 一、社區的定義

     Newman第一次提出模塊度定義就是在2004年發表的這篇文章“fast algorithm for community structure in networks”,第一次用量化的公式來確定社區划分。

     首先,我們來看Newman如何定義社區的:the vertices in networks are often found to cluster into tightly knit groups with a high density of within-group edges and a lower density of between -group edges。

    用大白話說就是:社區內部的邊盡可能地多,但是社區之間的邊盡可能地少

(一些定義):i、j指社區i和社區j;

                   n是網絡中節點的數量;

                   m是網絡中邊的數量。一條邊上連接兩個節點,和明顯,2m即網絡中所有節點度之和

二、如何量化到模快度?

    我們先用eij表示社區i和社區j之間連接的邊的數量比整個網絡邊的數量,eii表示社區i內部邊的數量比整個網絡邊的數量,既然這樣的話我們只要使∑ieii盡可能大就好了,但是問題又來了,最大肯定就是1咯,所有節點歸為一個社區,那這樣很明顯就沒有意義了。

    於是他有提出,網絡中連接兩個同種類型的邊(即社區內部的邊的比例eii)減去在相同結構下任意連接這兩個節點邊的比例的期望,於是模塊度登場

               Q=∑i(eii-ai2)

 其中,ai=∑jeij  表示與社區i中節點相連的邊占所有邊的比例。如果社團內部邊的比例不大於社團內部邊隨機連接的期望,那么Q=0,最大時為1。一般來說,Q值最大對應的社團結構就是網絡中的社團結構

三、如何變成算法可操作性?

     意思來了,我們只要優化Q就好了,但是如何把n個節點划分多少個社區?每個社區多少個節點?作者指出有2n-1種可能,這樣的話根本無法將Q推廣在高於20節點以上的網絡?為了減少時間復雜度,作者提出一種貪婪策略

    FN:(1)首先將網絡中每個節點自定義成一個社區

           (2)計算出兩兩社區結合是Q的值,找到Q增加最大的或者減少最少的合並方式進行社區合並

           (3)直到所有社區合並成一個大社區時停止,找出合並過程中最大的Q是的社區划分結果

這個時候,Newman有注意到,當兩個社區合並時,模塊度的增量detaQ=(eji+eij-2ai*aj)=2(eij-2ai*aj)

四、代碼來了

 

clear all
close all
clc

% load preprocess.mat
% E=e;
load('dolphin.mat');
E=A;
% E(find(E>0))=1;%建立鄰接矩陣
tic;
e=E;
e(e==1)=1/sum(E(:));
a=sum(e);
n=size(A,2);
b=[1:n];
b=num2cell(b);%用來存儲社團元素的變量
c={};
k=1;
while length(e)>1
      lg=length(e);
      detaQ=-(10^9)*ones(n-k+1);%△Q
      for i=1:lg-1
          for j=i+1:lg
             if e(i,j)~=0
                detaQ(i,j)=2*(e(i,j)-a(i)*a(j));%計算△Q
             end
          end
      end
   if sum(detaQ+(10^9))==0
      break
   end
% Q(k)=max(detaQ(:));%尋找△Q的最大值,並把它存儲進Q(k)矩陣
%-----------------------------尋找最大△Q對應的兩個社團,並將其合並,並改變e矩陣
[I,J]=find(detaQ==max(detaQ(:)));

     for ii=1:length(I)
         e(J(ii),:)=e(I(ii),:)+e(J(ii),:);
         e(I(ii),:)=0;
         e(:,J(ii))=e(:,I(ii))+e(:,J(ii));
         e(:,I(ii))=0;

% e(I,I)=e(I,I)/2;
%—————————記錄△Q最大所對應的社團以及各社團中的元素

        b{J(ii)}=[b{I(ii)} b{J(ii)}];
        b{I(ii)}=0;
     end

  e(I,:)=[];
  e(:,I)=[];
  b(I)=[];
  c(k,:)=num2cell(zeros(1,n));
  c(k,1:length(b))=b;
  for kk=1:length(b)
      c2=cell2mat(c(k,kk));
      c2(c2==0)=[];
      c{k,kk}=c2;
      c2=[];
  end
a=sum(e);
k=k+1;
tmp=0;
  for jj=1:length(e)
      tmp=tmp+(e(jj,jj)-a(jj)*a(jj));
  end
Q(k)=tmp;
end
max_k=find(Q==max(Q(:)))-1;

ll=0;
for i=1:length(c(max_k,:))
    if sum(c{max_k,i})~=0
        ll=ll+1;
        c{max_k,i}=c{max_k,i}(c{max_k,i}~=0);
    end
end
c_newman=c(max_k,1:ll);
label=zeros(n,1);
for i=1:ll
    label(c{max_k,i}')=i;
end

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM