随机网络构建

随机网络构建

文章目录

  • 随机网络构建
    • @[toc]
      • 1 随机网络定义
      • 2 网络拓扑性质
        • 2.1 边数分布
        • 2.2 度分布
      • 3 代码实现

1 随机网络定义

随机网络与规则网络相对应,最为经典的随机网络模型是Erdös和Rényi研究的ER随机图模型,ER随机图模型有两种定义方式:

  • 方式一:给定节点数 N N N,固定连边数 M M M。每次随机选择一对节点并连边,重复 M M M次。每次选择两个不同节点并且没有连接的节点对,记作 G ( N , M ) G(N,M) G(N,M)。算法如下:

首先给定 N N N个节点和 M M M条待连接边

  • 随机选取一对没有边相连的不同节点,并在这对节点添加一条连边
  • 重复上述步骤 M M M
  • 方式二:给定 N N N个节点,任意两个不同节点之间有一条连边概率固定为 p p p,记作 G ( N , p ) G(N,p) G(N,p),算法如下

初始化 N N N个节点和固定概率 p p p

  • 选择一对没有边相连的节点对
  • 生成一个随机数 r ∈ [ 0 , 1 ] r\in[0,1] r[0,1]
  • 若r
  • 重复上述步骤直至所有节点都被考虑一次。

特殊地,当 p = 0 p=0 p=0,则形成 N N N个孤立的节点; p = 1 p=1 p=1,则形成 N N N阶全局耦合网络,对于无向网络,连边数为 N ( N − 1 ) / 2 N(N-1)/2 N(N1)/2;当 p ∈ ( 0 , 1 ) p\in(0,1) p(0,1),连边数取值位于区间 ( 0 , N ( N − 1 ) / 2 ) (0,N(N-1)/2) (0,N(N1)/2)


2 网络拓扑性质

2.1 边数分布

给定随机网络 G ( N , p ) G(N,p) G(N,p),该网络刚好有 M M M条边的概率:
P ( M ) = C C N 2 M p M ( 1 − p ) C N 2 − M P(M) = C_{C_N^2}^M p^M(1-p)^{C_N^2-M} P(M)=CCN2MpM(1p)CN2M
C N 2 C_N^2 CN2表示随即网络理论最大边数,刚好有 M M M条连边的概率满足二项分布。根据二项分布性质,随机变量 M M M的期望
E ( M ) = ∑ M = 0 C N 2 M P ( M ) = p N ( N − 1 ) / 2 E(M) = \sum_{M=0}^{C_N^2}MP(M) = pN(N-1)/2 E(M)=M=0CN2MP(M)=pN(N1)/2
上述结果是显然的,因为一对节点存在连边概率为 p p p,理论上存在 N ( N − 1 ) / 2 N(N-1)/2 N(N1)/2条连边,因此理论上仅存在 E ( M ) E(M) E(M)条连边。根据二项分布的二阶矩公式,不难得到随机变量 M M M方差为
D ( M ) = p ( 1 − p ) N ( N − 1 ) 2 D(M) = p(1-p)\dfrac{N(N-1)}{2} D(M)=p(1p)2N(N1)


2.2 度分布

任意节点与其他 k k k个节点相连接的概率为 p k ( 1 − p ) N − 1 − k p^k(1-p)^{N-1-k} pk(1p)N1k,这里 p p p为连接概率,与 k k k个节点连接,但与其他 N − 1 − k N-1-k N1k(除去自身)个节点不相连。选择方式共有 C N − 1 k C_{N-1}^k CN1k种,则
P ( k ) = C N − 1 k p k ( 1 − p ) N − 1 − k P(k) =C_{N-1}^kp^k(1-p)^{N-1-k} P(k)=CN1kpk(1p)N1k
根据二项分布期望公式得到
E ( k ) = p ( N − 1 ) , D ( k ) = p ( 1 − p ) ( N − 1 ) E(k) = p(N-1),D(k) =p(1-p)(N-1) E(k)=p(N1),D(k)=p(1p)(N1)

3 代码实现

下面使用R语言实现随机网络构建。可以快速使用igraph包,调用函数erdos.renyi.game即可。

library(igraph)
# ER网络构造
g.er <- erdos.renyi.game(10, 0.5)
ecount(g.er)
0.5*10*9/2
plot(g.er)

随机网络构建_第1张图片

也可以自己构建随机网络函数,参照第二种定义方式 G ( N , p ) G(N,p) G(N,p)的算法

ER <- function(N, p) {
  if (class(N) != "numeric") stop("节点数必须是整数")
  # N:节点个数
  # p: 连接概率
  library(igraph)
  M <- matrix(0, nrow = N, ncol = N)
  W <- matrix(0, nrow = N, ncol = N)
  for (i in 1:(N-1)) {
    for (j in (i+1):N) {
      if (j != i) {
        if (runif(1) < p) W[i, j] <- 1
      }
    }
  }
  g <- graph_from_adjacency_matrix(W, mode = "upper")
  list(matrix = W, Graph = g)
}

M <- 50
p <- 0.1
g <- ER(N = M, p=p)
plot(g$Graph,layout = layout.circle)
# 实际值变数
ecount(g$Graph)
# 理论值变数
p * M * (M - 1) / 2

随机网络构建_第2张图片

上面的随机网络是无向的,根据第二种定义也可以扩充为有向随机网络


ER <- function(n, probability,type = "undirected") {
  # N:节点个数
  # p: 连接概率
  # type网络类型
  if (class(n) != "numeric") stop("节点数必须是整数")
  if (probability < 0 | probability > 1) stop("连接概率取值为0-1")
    
  library(igraph)
  M <- matrix(0, nrow = n, ncol = n)
  W <- matrix(0, nrow = n, ncol = n)
  switch (type,
          "undirected" = {
            for (i in 1:(n-1)) {
              for (j in (i+1):n) {
                if (j != i) {
                  if (runif(1) < probability) W[i, j] <- 1
                }
              }
            }
            g <- graph_from_adjacency_matrix(W, mode = "upper")
          },
          "directed" = {
            for (i in 1:n) {
              for (j in 1:n) {
                if (j != i) {
                  if (runif(1) < probability) W[i, j] <- 1
                }
              }
            }
            g <- graph_from_adjacency_matrix(W, mode = "directed")
          }
  )
  list(matrix = W, Graph = g)
}
M <- 50
p <- 0.2
number_edges =numeric()
number_sampling = 1000
for(i in 1:number_sampling){
  g <- ER(n = M, probability=p,type = "undirected")
  number_edges[i] <-  ecount(g$Graph)
}
plot(1:number_sampling,number_edges,type = "l",xlab = "number_sampling",ylab = "number_edges")
lines(1:number_sampling, rep(p * M * (M - 1)/2,number_sampling),col = "blue",lwd = "2")
lines(1:number_sampling, rep(mean(number_edges),number_sampling),col = "red",lwd = "2")
grid(col = "black")
legend("top",legend = c("抽样个体连边","抽样平均连边","理论平均连边"),
       col = c("black","blue","red"),lwd = c(1,2,2),
       bty  = "n", ncol = 3,cex = 1,text.width = 150)

var(number_edges)
p*(1-p)*M*(M-1)/2

随机网络构建_第3张图片


-END-

参考书籍:汪小帆等,网络科学导论[M]. 北京: 高等教育出版社, 2012.

你可能感兴趣的:(R,社会网络,r语言,社会网络)