最近学习了下复杂网络相关的东西,总结了部分基础的理论,与使用R语言igraph包,总结如下,还需要继续深入,目前只学了皮毛。
1、结构复杂性
网络连接结构看上去错综复杂,网络连接结构可能是随时变化的,节点间连接可能具有不同的权重和方向。
2、节点复杂性
网络中节点可能是是具有分岔和混沌等复杂性行为的动力系统。且可能存在多种不同类型的节点,且又随时间进行演化。
3、各种复杂性因素的相互影响
实际的复杂网络会手法哦各种各样的影响和作用。此外,各种网络之间也存在密切的联系会加大分析难度。
目前而言,复杂网络理论的主要研究内容可以归纳为:
1、发现:揭示刻画网络系统结构的统计性质,以及度量这些性质的合适方法;
2、建模:建立合适的网络模型以帮助人们理解这些统计性质的以及产生机理;
3、分析:基于单个节点的特性和整个网络的结构性质分析与预测网络的行为;
4、控制:提出改善已有网络性能和设计新的网络的有效方法,特别是稳定性、同步和数据流通方面。
常用表达:D网络直径;N点数;M边数
1、平均路径长度,也称网络的特征路径长度,其中dij表示节点间距离,N为点数;
2、聚类系数;
整个网络的聚类系数C就是所有节点i的聚类系数的平均值(0-1区间)。
3、度分布;
度即为该节点连接其他节点的数目,一般用ki表示。有向网络中节点的度分为出度和入度,出度即该节点只想其他节点的数目,入度即其他节点指向该节点的数据。直观上看,一个节点的度越大意味着这个节点在某种意义上越重要。所有节点的度的平均值成为网络的平均度,记作网络中的节点的度的分布情况可硬分布函数P(k)来描述,表示一个随机选定的节点的度恰好为k的概率。
度的分布一般有两种形式:Poisson分布,对应均匀网络;以及幂律分布,也称无标度分布,对应无标度网络,幂律分布曲线比Poisson指数分布曲线下降要缓慢的多;
一个度分布具有适当的幂指数的幂律形式的大规模无标度网络中,绝大部分的节点的度相对很低,但存在少量的度相对很高的节点为非均匀网络,而那些度相对很高的节点称为网络的集线器。
无标度网络与随机网络对比,便于理解区分,参考下图:
累计度分布函数:表示度数据的一种方法;
测量性质:
1、有向或无向;
2、节点总数N;
3、边的总数M(是否考虑重边);
4、平均度数;
5、平均路径长度;
6、聚类系数;
7、若符合幂律,则给出幂指数r(有向网络,则需分别给出入度指数和出度指数);
子图与模体:子图描绘了从局部层次刻画一个给定网络的相互连接的特定模式。复杂网络中可能包含各种各样的子图,如三角形、正方体和五角形等,其中的一些子图所占的比例明显高于统一网络的完全随机化形式中这些子图所占的比例。这些子图就成为模体。
等级网络
实际系统中可能同时存在模块性、局部聚类、无标度拓扑特性,这时需要假设模块以某种迭代的方式生成了一个等级网络。
典型例子如下图,利用模块生成等级网络:
等级网络模型恰好将无标度拓扑与内在的模块结构集成起来,等级模块性的一个最重要的量化标志是节点聚类系数服从幂律这表明度很小的节点具有高的聚类系数且属于高度连接的小模块
超家族
复杂网络的自相似性
复杂网络关于R部分将目前自己整理了解的部分归纳一下。
从前面复杂网络部分的理论知识,知道复杂网络的基本统计性质有六点以了解网络概况:平均路径长度、聚类系数、度分布、有向或无向、节点总数N、边的总数M。利用igraph包来获取这些性质以及一些说明节点及边重要性指标例如点度中心度、接近中心度、中间中心度、特征向量中心度,可参考这个博客,这些指标在社交网络、推荐算法以及其他一些实际应用中均有一定作用,目前在这些模块还未有深入研究,只是大致了解了下,就不多写了。
实际操作:
1、随机网络和无标度网络,我们已经知道随机网络服从possion分布,无标度网络服从幂律分布,从下面可以具体看一下,随机网络度分布图。
library(igraph)
library(plyr)
g<-erdos.renyi.game(100,0.4,directed=T)#生成ER随机图表
degree<-degree(g,mode="all",normalized=T)#mode=in点入度;out=点出度;total点度中心度,三者统称绝对点中心度,相对点中心度=绝对点中心度/最大度数
plot(table(degree),type="h")#绘制直方图
2、相关指标计算
g<-erdos.renyi.game(100,0.4,directed=T)#生成ER随机图表
m<-gsize(g)#获取边数
n<-vcount(g)#获取顶点数
l<-mean_distance(g)##计算平均路径长度
c<-transitivity(g)#计算聚类系数
degree<-degree(g,mode="all",normalized=T)#mode=in点入度;out=点出度;total点度中心度,三者统称绝对点中心度,相对点中心度=绝对点中心度/最大度数
table(degree)#度统计
plot(table(degree),type="h")#绘制直方图
degree.distribution(g)#查看度分布
closeness(g,mode="in")##计算接近中心度,点与其他点距离之和的倒数
order(closeness(g,mode="in"))#排序
betweenness(g,normalized=T)#查看点的中间中心度,代表最短距离是否经过该点
edge.betweenness(g)#查看线的中间中心度
evcent(g,scale = F)$vector#计算点的特征向量中心度
page.rank(g)$vector#计算邻接矩阵,计算点的特征向量中心度
3、复杂网络数据导出
g<-erdos.renyi.game(100,0.4,directed=T)#生成ER随机图表
data_m<-as_data_frame(g, what="edges")##获取边数据
data_m2<-as_adjacency_matrix(g)##数据转化为邻接矩阵
g2<-graph_from_data_frame(data_m, directed =F, vertices = NULL)##基于边数据转化网络图
plot(g2,layout=layout.grid)#以图形展示
g3<-graph.adjacency(data_m2,mode="undirected")##基于邻接矩阵数据转化网络图
plot(g3,layout=layout.grid)
4、复杂网络图形设置
##无障碍##
g1<-graph.lattice(c(6,6,1),directed=T,mutual = T)#生成一个6*6的矩阵
V(g1)$name<-c(11,12,13,14,15,16,21,22,23,24,25,26,31,32,33,34,35,36,41,42,43,44,45,46,51,52,53,54,55,56,61,62,63,64,65,66)#设置顶点名称
V(g1)$color<-"pink"#设置顶点颜色
V(g1)$size<-12#设置顶点大小
pa<-get.all.shortest.paths(g1,which(V(g1)$name==11),which(V(g1)$name==66))$res[[1]]##最短路径算法
V(g1)[pa]$color<-"green"
#E(g1)$color<-"grey"
E(g1,path=pa)$color<-"red"#设置边颜色
plot(g1,layout=layout.grid)
##随机生成一个图
random<-erdos.renyi.game(50,0.2,directed=T)
#gnm<-sample_gnm(10,20,directed = F)#基于gnm生成图
#gnp<-sample_gnp(10,0.3,directed = F)#基于gnp生成图
V(random)$color<-"pink"#设置顶点颜色
V(random)$size<-10#设置顶点大小
E(random)$color<-"grey"#设置边颜色
pa<-get.all.shortest.paths(random,1,20)$res[[1]]##最短路径算法
E(random,path=pa)$color<-"red"#设置路径边的颜色
plot(random,layout=layout.fruchterman.reingold)