复杂网络MATLAB工具箱

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013408431/article/details/53942784
幂律分布
连续型:以f(x)表示某一数量指标的发生次数,若f(x)=f(x)-a,就称为幂律分布。
离散型:若p(k)为离散型随机变量的概率分布,若p(k)~ck-(a+1),则称p(k)为幂律分布。
p(k)=c/k-a, logp(k)=logc-alogk
在双对数坐标系下,该分部呈现为一条斜率为负幂指数的直线
基本规律总结起来:只有少数节点才会被经常使用,大部分的节点很少被使用。
一个网络的度分布服从幂律分布,直观上看就是少部分节点度极大,与许多节点相连,而大部分节点度都比较小,这种网络就叫做无标度网络

复杂网络MATLAB工具包
http://www.levmuchnik.net/常用的一些关于复杂网络的MATLAB程序。


教程1:
展示了如何生成一个随机无标度网络图,基本结构分析,包括度分布、聚类系数等。观察两种类型的攻击对网络的影响:随机攻击(所有的几点有相同的概率从网络中删除)、有目标地选择连接度最大的节点(节点度最大的节点从网络中删除)。
第二中情况下,网络几乎很快崩溃,第一种情况好一些。

教程1的相关MATLAB程序:
%% Tutorial 01
% The following scripts is a first phase of the Complex Networks Package tutorial.
% It demonstrates genration of random scale-free network and some basic analysis of it.

%% Genrate the network:生成一个网络
NumberOfNodes = 10000; % Number of nodes节点的个数
Alpha = -2.2;   % Alpha of the scale-free graph无标度网络的幂律指数
%define node degree distribution:定义节点度分布
XAxis  = unique(round(logspace(0,log10(NumberOfNodes),25)));
YAxis  = unique(round(logspace(0,log10(NumberOfNodes),25))).^(Alpha+1);
% create the graph with the required node degree distribution:根据所需节点度分布创建
Graph = mexGraphCreateRandomGraph(NumberOfNodes,XAxis,YAxis,1);


%% Some basic statistics:一些基本特性

%Number of nodes in graph:图的节点的个数
disp(sprintf('Number of Nodes: %d',GraphCountNumberOfNodes(Graph)));
%Number of links in graph:图的连边的个数
disp(sprintf('Number of Links: %d',GraphCountNumberOfLinks(Graph)));
%Average degree:平均度
Degrees = GraphCountNodesDegree(Graph);
disp(sprintf('Average Node Degree: %2.2f',mean(Degrees(:,2))));
%Find fraction of reciprocal links:找出相互连接的部分
Reciprocal = GraphCountUnderectionality(Graph);
disp(sprintf('Fraction of reciprocal links: %2.2f%%',Reciprocal.DoubleConnectivityFraction*100));
% Clustering coefficient:聚类系数
CC = mexGraphClusteringCoefficient(Graph);
disp(sprintf('Average Clustering Coefficient: %3.3f%%',CC.C));

%% Node Degree Distribution:度分布(度分布是复杂网络的最重要的一个需要分析的属性)
h1 = figure;
% incoming:入度
[y x] = hist(Degrees(:,2),unique(Degrees(:,2)));
loglog(x,y/sum(y),'*r');
hold on
% outgoing:出度
[y x] = hist(Degrees(:,3),unique(Degrees(:,3)));
loglog(x,y/sum(y),'dg');
% expected distribution:预期的分布
loglog(XAxis,YAxis/sum(YAxis),':b');

xlabel('k,Degree');
ylabel('P(k)');
title('Node Degree Distribution');
legend({'Incoming','Outgoing','Expected'});

%%  Clustering Coefficient Distribution:聚类系数分布(高聚类特性是现实世界中无标度网络的另一个重要特性)
h2= figure;
% direct
CCin = mexGraphClusteringCoefficient(Graph,[],'direct');
[y x] = hist(CCin.NodeClusteringCoefficient,linspace(0,1,25));
plot(x(x>0),y(x>0)/sum(y),'*r');
hold on;
% inverse
CCout = mexGraphClusteringCoefficient(Graph,[],'inverse');
[y x] = hist(CCout.NodeClusteringCoefficient,linspace(0,1,25));
plot(x(x>0),y(x>0)/sum(y),'dg')
xlabel('CC, clustering coefficient');
ylabel('P(CC)');
title('Clustering coefficient distribution (CC>0)');
legend({'Direct','Inverse'});
%%  Clustering Coefficient Dependence of Degree:聚类系数与度之间的关系(一个节点的聚类系数和节点度之间有什么关系?节点的平均聚类系数与度之间的关系分析)
h3 = figure;
% direct
loglog(CCin.k,CCin.Ck,'*r');
hold on;
% inverse
loglog(CCout.k,CCout.Ck,'dg');

xlabel('k, Degree');
ylabel('<CC(k)>, clustering coefficient');
title('Average clustering coefficient as a function of degree');
legend({'Direct','Inverse'});

%% Components组件(找出所有的强连接组件,)
remove random node untill the graph breaks apart:随机删除节点直到图分裂


%% 
TempGraph=Graph;
NodesToRemovePerStep =1;
NumbersOfNodes = [];
NumbersOfLinks = [];
NumbersOfComponents = [];
LargestClusterSizes = [];
SecondLargestClusterSizes = [];

RemainingNodes = 1:NumberOfNodes;

while ~isempty(RemainingNodes)
    NodeIndecesToRemove = unique(round(rand(NodesToRemovePerStep,1)*(numel(RemainingNodes)-1))+1);
    NodesToRemove = RemainingNodes(NodeIndecesToRemove);
    RemainingNodes = setdiff(RemainingNodes,NodesToRemove);
    TempGraph = mexGraphNodeRemove(TempGraph,NodesToRemove);
    NumbersOfNodes(end+1) = GraphCountNumberOfNodes(TempGraph);
    NumbersOfLinks(end+1) = GraphCountNumberOfLinks(TempGraph);
    if NumbersOfLinks(end)>0
        Components = mexGraphConnectedComponents(TempGraph);
        NumbersOfComponents(end+1) = numel(Components);
        ComponentsSizes = sort(cellfun('length',Components),'descend');        
        if ~isempty(ComponentsSizes)
            LargestClusterSizes(end+1) = ComponentsSizes(1);
        else
            LargestClusterSizes(end+1) = 0;
        end
        if numel(ComponentsSizes)>1
            SecondLargestClusterSizes(end+1) = ComponentsSizes(2);
        else
            SecondLargestClusterSizes(end+1) = 0;
        end
    else
        NumbersOfComponents(end+1) = 0;
        LargestClusterSizes(end+1) = 0;
        SecondLargestClusterSizes(end+1) = 0;
    end
end
h4 = figure;
plot(NumbersOfComponents,'r');
hold on;
h5 = figure;
plot(NumbersOfNodes,'r');
hold on;
h6 = figure;
plot(NumbersOfLinks,'r');
hold on;
h7 = figure;
plot(SecondLargestClusterSizes,'r');
hold on;
h8=figure;
plot(LargestClusterSizes,'r');
hold on;

%% remove most connected nodes (with heighest outgoing degree):删除出度最大的节点
TempGraph=Graph;
NodesToRemovePerStep =1;
NumbersOfNodes = [];
NumbersOfLinks = [];
NumbersOfComponents = [];
LargestClusterSizes = [];
SecondLargestClusterSizes = [];

RemainingNodes = 1:NumberOfNodes;

while ~isempty(TempGraph.Data)
    Degrees = GraphCountNodesDegree(TempGraph);
    [OutDegrees SortOrder]=sort( Degrees(:,3),'descend');
    NodesToRemove = Degrees(SortOrder(1:min([numel(SortOrder) NodesToRemovePerStep])));
    TempGraph = mexGraphNodeRemove(TempGraph,NodesToRemove);
    NumbersOfNodes(end+1) = GraphCountNumberOfNodes(TempGraph);
    NumbersOfLinks(end+1) = GraphCountNumberOfLinks(TempGraph);
    if NumbersOfLinks(end)>0
        Components = mexGraphConnectedComponents(TempGraph);
        NumbersOfComponents(end+1) = numel(Components);
        ComponentsSizes = sort(cellfun('length',Components),'descend');
        if ~isempty(ComponentsSizes)
            LargestClusterSizes(end+1) = ComponentsSizes(1);
        else
            LargestClusterSizes(end+1) = 0;
        end
        if numel(ComponentsSizes)>1
            SecondLargestClusterSizes(end+1) = ComponentsSizes(2);
        else
            SecondLargestClusterSizes(end+1) = 0;
        end
    else
        NumbersOfComponents(end+1) = 0;
        LargestClusterSizes(end+1) = 0;
        SecondLargestClusterSizes(end+1) = 0;
    end
end
figure(h4)
plot(NumbersOfComponents,'g');
xlabel('Step');
ylabel('Number of components');
legend({'Random','Targeted'});
figure(h5)
plot(NumbersOfNodes,'g');
xlabel('Step');
ylabel('Number of Nodes');
legend({'Random','Targeted'});
figure(h6)
plot(NumbersOfLinks,'g');
xlabel('Step');
ylabel('Number of Links');
legend({'Random','Targeted'});
figure(h7);
plot(SecondLargestClusterSizes,'g');
xlabel('Step');
ylabel('Cluster Size');
title('Size of SECOND largest cluster');
legend({'Random','Targeted'});
figure(h8);
plot(LargestClusterSizes,'g');
xlabel('Step');
ylabel('Cluster Size');
title('Size of largest cluster');
legend({'Random','Targeted'});

运行教程1的MATLAB程序:
图1:Node Degree Distribution度分布

图2:聚类系数分布

图3:聚类系数的依赖度

图4:大量的集群出现相变
图5:节点的数量的变化
图6:连边的数量的变化
图7:第二大集群的峰值表明相变
图8:最大聚类的规模的变化


教程2:
Susceptible-Infected model(SI模型)



展开阅读全文

没有更多推荐了,返回首页