网络数据统计分析笔记||网络图的数学模型

前情回顾:
Gephi网络图极简教程
Network在单细胞转录组数据分析中的应用
Gephi网络图极简教程
Network在单细胞转录组数据分析中的应用
网络数据统计分析笔记|| 为什么研究网络
网络数据统计分析笔记|| 操作网络数据
网络数据统计分析笔记|| 网络数据可视化
网络数据统计分析笔记|| 网络数据的描述性分析

在前面的章节中我们了解到网络图的构建,可视化,以及网络结构的特征化描述。从本章开始,我们将进入网络图建模的主题,在网络数据分析中构建与使用模型。本章主要介绍几种常见的数学模型,就像我们在学统计建模的时候,先要学习几个常见的分布模型一样。关于统计建模的一般性描述见环境与生态统计:R语言应用

所谓的网络图模型是指:
\{P_\theta(G),G \in \scr G : \theta \in \Theta \rbrace

其中\scr G是所有可能的图的集合,P_\theta\scr G上的一个概率分布,\theta是参数构成的向量,该向量的所有可能取值为\Theta

  • 经典随机图模型
  • 伯努利随机图模型
  • 广义随机图模型
  • 基于机制的网络图模型
    • 小世界模型
    • 优先连接模型
    • BA随机图(igraph::barabasi.game)
  • 评估网络图特征的显著性
    • 评估网络社团数量
    • 评估小世界性
经典随机图模型

在随机图模型(Random graphs)中,我们模仿这样的一个环境,假如一个团体中有很多的个体,之后两个人随机的认识并且成为朋友,那么随着时间的推移,这个团体会变成什么样子呢?或者说这个以人为节点,边代表好友关系的网络会是什么样子的呢?

  • 随机图模型是后续的基础,也是重要的参考模型
  • 有助于我们通过比较更深入地认识真实网络数据
  • 随机图模型能帮助我们理解随机过程对网络结构能够产生多大程度的影响。

正式地讲,随机图模型通常是指一个给定了集合\scr G及其上的均匀概率分布P的模型。其重要作用和完备性就像统计建模中的均匀分布一样。

比较常见的随机网路模型是Erdos-Renyi model,可以通过sample_gnp来构建。

library(sand)
set.seed(42)
?sample_gnp
g.er <- sample_gnp(100, 0.02)
layouts <- grep("^layout_", ls("package:igraph"), value=TRUE)[-1] 
# Remove layouts that do not apply to our graph.
layouts <- layouts[!grepl("bipartite|merge|norm|sugiyama|tree", layouts)]

length(layouts)
par(mfrow=c(3,5), mar=c(1,1,1,1))
for (layout in layouts) {
   print(layout)
   l <- do.call(layout, list(g.er)) 
   plot(g.er, edge.arrow.mode=0, layout=l, main=layout) }
# CHUNK 2
is_connected(g.er)
# ---
## [1] FALSE
# ---

查看图中组件和团的情况

table(sapply(decompose(g.er), vcount)) # 组件的普查

 1  2  3  4 71 
15  2  2  1  1 

table(sapply(cliques(g.er), length))  # 团的普查

  1   2   3 
100  95   1  
par(mfrow=c(3,7), mar=c(1,1,1,1))
for(i in 1: length(decompose(g.er))){
   l <- do.call(layout_with_lgl, list(decompose(g.er)[[i]]) )
   plot(decompose(g.er)[[i]], edge.arrow.mode=0, layout=l, main=i)
   box(which = "figure", col = "blue", lwd = 1)
   
}
box(which = "outer", col = "red",  lwd = 10)

可以看到我们生成的随机图不是连通的,有一个 巨型组件。

经典随机网络的性质包括:平均度与期望值比较接近,度分布均匀,节点对之间最短路径上的节点相对较少等。

# CHUNK 4
mean(degree(g.er))
# ---
## [1] 1.9
# ---

# CHUNK 5
hist(degree(g.er), col="lightblue",
   xlab="Degree", ylab="Frequency", main="")

# CHUNK 6
mean_distance(g.er)
# ---
## [1] 5.276511
# ---
diameter(g.er)
# ---
## [1] 14
# ---

# CHUNK 7
transitivity(g.er)
# ---
## [1] 0.01639344
# ---
广义随机图模型

广义随机图模型是经典随机图模型的一般化,具体地:

  • 定义图集合\scr G,包含阶数为N_v,且具有给定特征的所有图;
  • 为每个图G\in \scr G分配相同的概率。

在Erdos-Renyi模型之外,最常选择的特征是固定度序列。假设对于节点数为8,一半节点的度为2,另4个节点的度为3,从满足条件的图集合中均匀抽取两个。

degs <- c(2,2,2,2,3,3,3,3)
#?sample_degseq
g1 <- sample_degseq(degs, method="vl")
g2 <- sample_degseq(degs, method="vl")
par(mfrow=c(1,2), mar=c(1,1,1,1))
plot(g1, vertex.label=NA)
plot(g2, vertex.label=NA)
isomorphic(g1, g2)
# ---
## [1] FALSE
# ---

c(ecount(g1), ecount(g2))
# ---
## [1] 10 10
# ---

可见两个图并非同构。

我们可以从构建一个与已知图序列相同的图:

data(yeast)
degs <- degree(yeast)
fake.yeast <- sample_degseq(degs, method=c("vl"))
all(degree(yeast) == degree(fake.yeast))
[1] TRUE
plot(yeast,vertex.label=NA)
plot(fake.yeast,vertex.label=NA)
diameter(yeast)
# ---
## [1] 15
# ---
diameter(fake.yeast)
# ---
## [1] 8
# ---

# CHUNK 13
transitivity(yeast)
# ---
## [1] 0.4686178
# ---
transitivity(fake.yeast)
# ---
## [1] 0.04026804
# ---

模拟图直径减少一半,之前的聚类也减少了。

基于机制的网络图模型

随机图模型为我们描述了在不受任何条件控制的条件下的图,可理解为数学模型的背景模型,但是现实世界里的图往往是由特定结构的。基于机制的网络图模型 把我们带入了现实世界。其中最著名的需要所小世界模型了。

  • Small-World Model

小世界模型最经典的特征是既具有规则网络的高聚集性,又具有类似随机网络的小直径。相较随机图模型,小世界模型能够更好地反映真实网络的情况。就像我们人类社会一样,人以群分,六度分隔。




例如在写本笔记的时候:

媒体经常提到COVID-19呼吸道疾病的病例和死亡人数呈“指数”增长,但这些数字暗示了其他东西,一个可能具有幂律属性的“小世界”网络。这将大大不同于疾病的指数增长路径。

在介绍随机网络时提到,随机网络无法解释真实网络中存在的一些情况:局部集聚(较高的集聚系数)和三元闭合(朋友的朋友是朋友)。从网络结构来看,随机网络与真实网络的一大差异便是过低的集聚系数,所以在随机网络模型基础上进行改进时,需要要着重考虑的便是——如何在保留小网络直径这一特点的同时提高集聚系数,使得构建的模型能够对网络局部结构进行更好的刻画。

g.ws <- sample_smallworld(1, 25, 5, 0.05)
par(mfrow=c(3,5), mar=c(1,1,1,1))
for (layout in layouts) {
   print(layout)
   l <- do.call(layout, list(g.ws)) 
   plot(g.ws, edge.arrow.mode=0, layout=l, main=layout) }

dev.off()

小世界的性质:

# CHUNK 15
g.lat100 <- sample_smallworld(1, 100, 5, 0)
transitivity(g.lat100)
# ---
## [1] 0.6666667
# ---

# CHUNK 16
diameter(g.lat100)
# ---
## [1] 10
# ---
mean_distance(g.lat100)
# ---
## [1] 5.454545
# ---

# CHUNK 17
g.ws100 <- sample_smallworld(1, 100, 5, 0.05)
diameter(g.ws100)
# ---
## [1] 5
# ---
mean_distance(g.ws100)
# ---
## [1] 2.748687
# ---
transitivity(g.ws100)
# ---
## [1] 0.5166263
# ---
steps <- seq(-4, -0.5, 0.1)
len <- length(steps)
cl <- numeric(len)
apl <- numeric(len)
ntrials <- 100
function(x) {
  for (i in (1:len)) {
   cltemp <- numeric(ntrials)
   apltemp <- numeric(ntrials)
   for (j in (1:ntrials)) {
     g <- sample_smallworld(1, 1000, 10, 10^steps[i])
     cltemp[j] <- transitivity(g)
     apltemp[j] <- mean_distance(g)
   }
   cl[i] <- mean(cltemp)
   apl[i] <- mean(apltemp)
 }
}
cl <- c(0.710063379997766, 0.709978692214238, 0.709907143256545, 0.709724130686251,
0.709438119171845, 0.709084388626035, 0.708846266062516, 0.70839051192321,
0.707759691875033, 0.707113107172047, 0.706190905933217, 0.705111695935303,
0.703784841816035, 0.702347962546443, 0.699998029666335, 0.696966876979092,
0.693486200400489, 0.689434391992611, 0.683909800354255, 0.676998368887877,
0.669280399418907, 0.657931797843006, 0.645296561052957, 0.628819148376097,
0.609573848258676, 0.585356133848734, 0.55633728515175, 0.521088308467222,
0.480754321558662, 0.433680652553029, 0.378558209487185, 0.318761294080951,
0.25616767320489, 0.193136725458156, 0.134572797222469, 0.0849655822333312)
apl <- c(19.2309712512513, 18.1696153953954, 17.7627795195195, 16.6679303103103,
14.5979843643644, 12.8854347747748, 12.1038251251251, 11.2341607007007,
9.82806862862863, 9.11716512512512, 8.24078900900901, 7.61965115115115,
7.0006803003003, 6.52964078078078, 6.03792086086086, 5.60314024024024,
5.26338822822823, 4.98922616616617, 4.70584088088088, 4.45406394394394,
4.26384696696697, 4.05971747747748, 3.89097137137137, 3.72829705705706,
3.58416728728729, 3.45041687687688, 3.33307095095095, 3.22760666666667,
3.12912454454454, 3.0362582982983, 2.94736488488488, 2.87122124124124,
2.80854338338338, 2.75799567567568, 2.71760948948949, 2.68516954954955)

# CHUNK 19
plot(steps, cl/max(cl), ylim=c(0, 1), lwd=3, type="l",
   col="blue", xlab=expression(log[10](p)),
   ylab="Clustering and Average Path Length")
lines(steps, apl/max(apl), lwd=3, col="red")
  • 优先连接模型

优先连接”(preferential attachment)指的是进入一个网络的新节点倾向于与节点度高的节点相连接。反过来说,一个节点如果已经接受了很多连接,那么它就越容易被新来的节点所连接。

优先连接现象最早是在1925年,由英国统计学家George Udny Yule研究的。后来科学计量之父Derek J. de Solla Price在1976年也研究了这一现象,并把它叫做积累优势(cumulative advantage)。不过,描述优先连接最著名的模型是Albert-Laszlo Barabasi和Reka Albert提出的,所以也被叫做Barabási–Albert模型或BA模型。它的基本形式非常简明:一个新的节点i连接到网络里某个已有节点j的概率,就是节点j的度占全部已有节点的度之和的比重。

BA模型的节点度符合幂律分布,生成的是一个无标度网络(scale-free network)。
网络无标度性的形成有两个基本的要素:一是网络生长,也就是新的节点加入网络的过程;二是网络生长过程当中的优先连接。

set.seed(42)
?sample_pa
g.ba <- sample_pa(100, directed=FALSE)

# CHUNK 21
par(mfrow=c(3,5), mar=c(1,1,1,1))
for (layout in layouts) {
   print(layout)
   l <- do.call(layout, list(g.ba)) 
   plot(g.ws, edge.arrow.mode=0, layout=l, main=layout) }


hist(degree(g.ba), col="lightblue",
   xlab="Degree", ylab="Frequency", main="")

ba网络的性质

# CHUNK 23
summary(degree(g.ba))
# ---
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    1.00    1.00    1.98    2.00    9.00
# ---

# CHUNK 24
mean_distance(g.ba)
# ---
## [1] 5.815556
# ---
diameter(g.ba)
# ---
## [1] 12
# ---

# CHUNK 25
transitivity(g.ba)
# ---
## [1] 0
# ---

评估网络图特征的显著性

如开头所言,随机网络作为网络的背景,它经常用来评估网络特征的显著性:即,待观测的网络与随机网络有多大程度的不一样?

假设我们有一个来自某种观测的图,此处称为G^{obs},而我们对某些结构特征感兴趣,不妨称为\eta(·)。在很多情况下,自然会考虑\eta(G^{obs})是否是显著的,即在某种意义上是不寻常的和超预期的。这一过程很像我们的统计推断过程统计推断概述

  • 评估网络社团数量

生成参考分布

  • 与待观测图相同规模和阶数的图
  • 与待观测图有相同的度分布

# CHUNK 26
data(karate)
nv <- vcount(karate)
ne <- ecount(karate)
degs <- degree(karate)

# CHUNK 27
ntrials <- 1000 # 模拟1000次

# 经典随机图
num.comm.rg <- numeric(ntrials)
for(i in (1:ntrials)){
   g.rg <- sample_gnm(nv, ne)
   c.rg <- cluster_fast_greedy(g.rg)
   num.comm.rg[i] <- length(c.rg)
}

# 广义随机图
num.comm.grg <- numeric(ntrials)
for(i in (1:ntrials)){
   g.grg <- sample_degseq(degs, method="vl")
   c.grg <- cluster_fast_greedy(g.grg)
   num.comm.grg[i] <- length(c.grg)
}
rslts <- c(num.comm.rg,num.comm.grg)
indx <- c(rep(0, ntrials), rep(1, ntrials))
counts <- table(indx, rslts)/ntrials
barplot(counts, beside=TRUE, col=c("blue", "red"),
   xlab="Number of Communities",
   ylab="Relative Frequency",
   legend=c("Fixed Size", "Fixed Degree Sequence"))

而真实的我们数据的社团数是:

length(cluster_fast_greedy(karate))
[1] 3

可以说是很显著的了。这时,你要问为什么?

  • 评估小世界性

评估小世界性的一种经典方法是:针对待观测网络以及可能观测到的/经过适当修饰的经典随机图,比较两者聚类系数和平均(最短)路径的长度。如果出现小世界性:

  • 聚类系数大于随机图
  • 平均路径基本相同

评估有向图的小世界性:

library(igraphdata)
data(macaque)
summary(macaque)
# ---
## IGRAPH f7130f3 DN-- 45 463 -- 
## + attr: Citation (g/c), Author (g/c), shape (v/c), 
##   name (v/c)
# ---

# CHUNK 32  有向图聚类系数 
clust_coef_dir <- function(graph) {
   A <- as.matrix(as_adjacency_matrix(graph))
   S <- A + t(A)
   deg <- degree(graph, mode=c("total"))
   num <- diag(S %*% S %*% S)
   denom <- diag(A %*% A)
   denom <- 2 * (deg * (deg - 1) - 2 * denom)
   cl <- mean(num/denom)
   return(cl)
}

# CHUNK 33 # 模拟评估 
ntrials <- 1000
nv <- vcount(macaque)
ne <- ecount(macaque)
cl.rg <- numeric(ntrials)
apl.rg <- numeric(ntrials)
for (i in (1:ntrials)) {
   g.rg <- sample_gnm(nv, ne, directed=TRUE)
   cl.rg[i] <- clust_coef_dir(g.rg)
   apl.rg[i] <- mean_distance(g.rg)
}

# CHUNK 34
summary(cl.rg)
# ---
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
##  0.2159  0.2302  0.2340  0.2340  0.2377  0.2548
# ---

# CHUNK 35
summary(apl.rg)
# ---
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
##   1.810   1.827   1.833   1.833   1.838   1.858
# ---

# CHUNK 36
clust_coef_dir(macaque)
# ---
## [1] 0.5501073
# ---
mean_distance(macaque)
# ---
## [1] 2.148485
# ---

0.5501073 > 0.2548 ; 2.148485 > 1.858 具有一定程度的小世界性质。


https://zhuanlan.zhihu.com/p/146499763
https://zhuanlan.zhihu.com/p/205012648
https://blog.csdn.net/limiyudianzi/article/details/81632139
http://economics.mit.edu/files/4623#:~:text=Generalized%20random%20graph%20models%20%28such%20as%20the%20con,combines%20high%20clustering%20with%20short%20path%20lengths%20is
https://ocw.mit.edu/courses/economics/14-15j-networks-spring-2018/lecture-and-recitation-notes/MIT14_15JS18_lec12.pdf
https://zhuanlan.zhihu.com/p/37121528
https://www.zdnet.com/article/graph-theory-suggests-covid-19-might-be-a-small-world-after-all/
https://www.sohu.com/a/402313767_169228

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353