学习记录 复杂网络模型的matlab实现

来源:互联网 发布:数据采集有哪几种接头 编辑:程序博客网 时间:2024/04/28 19:49
度分布 

function [DeD,aver_DeD]=Degree_Distribution(A)

 %% 求网络图中各节点的度及度的分布曲线 

%% 求解算法:求解每个节点的度,再按发生频率即为概率,求P(k) 

%A————————网络图的邻接矩阵 

%DeD————————网络图各节点的度分布

%aver_DeD———————网络图的平均度 

N=size(A,2);

DeD=zeros(1,N); 

for i=1:N 

   % DeD(i)=length(find((A(i,:)==1)));

    DeD(i)=sum(A(i,:));

end 

aver_DeD=mean(DeD);

   

if sum(DeD)==0 

    disp('该网络图只是由一些孤立点组成'); 

    return; 

else  

    figure;      
    bar([1:N],DeD);   

    xlabel('节点编号n'); 

    ylabel('各节点的度数K'); 

    title('网络图中各节点的度的大小分布图'); 

end 

  

figure; 

M=max(DeD); 

for i=1:M+1;    %网络图中节点的度数最大为M,但要同时考虑到度为0的节点的存在性 

    N_DeD(i)=length(find(DeD==i-1)); % DeD=[2 2 2 2 2 2] 

end 

P_DeD=zeros(1,M+1); 

P_DeD(:)=N_DeD(:)./sum(N_DeD); 

bar([0:M],P_DeD,'r'); 

xlabel('节点的度 K'); 

ylabel('节点度为K的概率 P(K)'); 

title('网络图中节点度的概率分布图'); 



平均路径长度 

function [D,aver_D]=Aver_Path_Length(A) 

%% 求复杂网络中两节点的距离以及平均路径长度 

%% 求解算法:首先利用Floyd算法求解出任意两节点的距离,再求距离的平均值得平均路径长度 

%  A————————网络图的邻接矩阵 
%  D————————返回值:网络图的距离矩阵 
%  aver_D———————返回值:网络图的平均路径长度  

N=size(A,2);  

D=A; 

D(find(D==0))=inf;    %将邻接矩阵变为邻接距离矩阵,两点无边相连时赋值为inf,自身到自身的距离为0.  

for i=1:N  

      D(i,i)=0;       

end    

for k=1:N            %Floyd算法求解任意两点的最短距离    

      for i=1:N 

           for j=1:N 

                 if D(i,j)>D(i,k)+D(k,j)   

                    D(i,j)=D(i,k)+D(k,j); 

                 end

          end

      end

  end 

 aver_D=sum(sum(D))/(N*(N-1))  %平均路径长度 

 if aver_D==inf 

     disp('该网络图不是连通图');  

end 

 %% 算法2: 用时间量级O(MN)的广度优先算法求解一个含N个节点和M条边的网络图的平均路径长度     


聚类系数 
 function  [C,aver_C]=Clustering_Coefficient(A) 

%% 求网络图中各节点的聚类系数及整个网络的聚类系数 

%% 求解算法:求解每个节点的聚类系数,找某节点的所有邻居,这些邻居节点构成一个子图 

%% 从A中抽出该子图的邻接矩阵,计算子图的边数,再根据聚类系数的定义,即可算出该节点的聚类系数 

%A————————网络图的邻接矩阵 

%C————————网络图各节点的聚类系数 

%aver———————整个网络图的聚类系数

N=size(A,2); 

C=zeros(1,N); 

for i=1:N 

     aa=find(A(i,:)==1);  %寻找子图的邻居节点

     if isempty(aa)

        disp(['节点',int2str(i),'为孤立节点,其聚类系数赋值为0']);

        C(i)=0; 

  else         
        m=length(aa);

        if m==1  

            disp(['节点',int2str(i),'只有一个邻居节点,其聚类系数赋值为0']);  

            C(i)=0; 

        else 

            B=A(aa,aa)          % 抽取子图的邻接矩阵

            C(i)=length(find(B==1))/(m*(m-1)); 

        end 

    end

 end 

aver_C=mean(C)

4 0