201511260117 韩聪宇 政管信管
1) 用Gephi软件对空手道俱乐部进行可视化表达;
2) 对基本统计性质进行计算(所有相关代码均在文后)
链接矩阵
度及度分布/网络的平均度 度分布的图如下所示:
所以,平均度为4.588
介数及其分布
集聚系数及其分布/网络的集聚系数 平均聚集系数:0.5679
网络的平均距离、直径 2.4162——平均距离 5——直径
网络的度度关联/度的匹配性 度度关联系数为-0.4789
所以我们可以得知该网络属于度-度负相关 disassortativeness类型
代码页:
1) 度以及度分布是在第三次作业中完成的,此处不赘述其代码 2) 介数的代码如下:
function [p,Nb,Eb]= betweenness(A)
%求邻接矩阵对应的网络的节点介数Nb和边介数Eb,并在p中输出所有最短路径。在floyd算法基础上得来。
%先利用floyd算法得到最短路径和路径矩阵(path(i,j)=从i到j最短路的第一跳节点号),然后利用path矩阵
%求出所有最短路径矩阵short_path,并根据short_path矩阵得到所有节点和边的介数。 %----先求path矩阵------------------------- %circlenet(A);
n=size(A,1); D=A;
path=zeros(n,n); for i=1:n for j=1:n
if D(i,j)~=inf
path(i,j)=j; %j是i的后续点 end end end
for k=1:n 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); path(i,j)=path(i,k); end end end end
%------再求介数-------------------------
short_path=zeros(n,n,n);%short_path是所有最短路径,最后一个n表示源节点,中间的n表示目的节点,第一个n表示路径,
%因为最长路径去掉源节点还可能有n-1个点。short_path的列向量表示一条最短路径
Nbc=zeros(1,n); %存储节点的介数 Ebc=zeros(n,n); %存储边的介数 for i=1:n %i是起点
short_path(1,:,i)=i;%初始化每列的第一元素为源节点 for j=1:n %j是终点 middle_node=i;
if D(i,j) next_node= path(middle_node,j); Ebc(middle_node,next_node)= Ebc(middle_node,next_node)+1; short_path(k,j,i)= next_node; middle_node= next_node; if middle_node~=j Nbc(1,middle_node)= Nbc(1,middle_node)+1; end end end end end end p=short_path; Nb=Nbc/2; %无向图用此公式 Eb=triu(Ebc); %无向图用此公式 3) 集聚系数代码如下: function [ACC,CC0]=Clustering_Coefficient(Links_M) %计算网络的聚类系数 %输入为网络的邻接矩阵 %输出为标量的网络的聚类系数:ACC %算法的思想是:对每一个节点i找到它的邻居,并记录邻居的下标,然后在这些邻居中找大于0的数的总个数(也就是总边数) %注意Matlab中find()子函数的调用,查找大于零的元素并返回其下标 Links_M0=Links_M; n0=length(Links_M0); %矩阵的维数 CC0=sparse(n0,1); %存放每个节点的所对应的聚类系数 TCC=0; %初始化总的聚类系数 for i=1:n0 i_neighbor=find(Links_M0(i,:)); %查找i点的邻居,就是Links(i,j)=1的点, 返回的是邻居节点下标的组成的向量 i_neighbor_number=length(i_neighbor); %节点i的邻居的数目 if i_neighbor_number>=2 %注如果邻居数为1的话,那么CC(i)=0, 无需计算,所以从邻居数大于等于2开始算 S=Links_M(i_neighbor,i_neighbor); %抽取i节点的所有的邻居所对应的行,列 CC0(i)=sum(S(:))/(i_neighbor_number*(i_neighbor_number-1)); %注意一个节点其度的和等于其变数的两倍,sum(S(:))表示矩阵S所有元素的和=度, %计算节点i的聚类系数 end end TCC=full(sum(CC0)); %总的聚类系数 ACC=TCC/n0; %网络的平均聚类系数 4) 网络的平均距离与直径的代码如下: 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 5) 度度关联系数的代码如下: function [ r ] = get_degree_correlation(A) %该函数用来求网络的度-度相关性 % 当 r > 0 度-度正相关 assortativeness % 当 r = 0 度-度没有相关 nonassortativeness % 当 r < 0 度-度负相关 disassortativeness % 输入参数是一个网络的邻接矩阵 %基于Pearson算法求 B = triu(A); M = size(find(B==1),1); sum1=0; sum2=0; sum3=0; A1 = find(B==1); length = size(A1,1); for i=1:length [x y]=ind2sub(size(B),A1(i)); sum1 = sum1+get_degree(A,x)*get_degree(A,y); sum2 = sum2+get_degree(A,x)+get_degree(A,y); sum3 = sum3+get_degree(A,x)^2+get_degree(A,y)^2; end x1 = sum1/M-(sum2/(2*M))^2; y1 = sum3/(2*M)-(sum2/(2*M))^2; r=x1/y1; end function [ out ] = get_degree(A,k) %GET_DEGREE Summary of this function goes here % Detailed explanation goes here %A为邻接矩阵 %得到网络A节点为k的度 row = A(k,:); out=size(find(row==1),2); end 因篇幅问题不能全部显示,请点此查看更多更全内容