最近看了一些网络传播扩展方面的内容,总结了网络扩散的数学理论以及相关实验。本博文主要介绍网络扩散的数学模型,下篇记录相关实验

先定义一些符号,

  • n=总人数
  • I=已经扩散的人数
  • i=In扩散占比
  • S=还没哟扩散的人数
  • s=Sn未扩散的占比
  • β感染率

根据定义,容易得到S+I=n,s+i=1

扩散模型可以微分方程表示,如下

dIdt=βSIn

扩散速率等于没有感染的人群遇到感染人群的概率并乘以感染率。将人数转成感染率,并且去掉S,可得到下面的微分方程

didt+βi2βi=0(1)

上面是一阶非线性微分方法,想办法转成线性微分方程才有办法解决,设y=1i(2),将(2)代入(1)整理如下,

dydt+βy=β(3)

现在是一阶非齐次线性微分方程,根据变系数线性微分方程通解,可以得到下面的关于y的方程

y=1+(C1+C2β)eβt(4)

将(4)代入(2),得到关于感染率i的方程,

i=11+(C1+C2β)eβt(5)

(5)式中,C1,C2是常量,t是时间,形状是个S,类似sigmoid函数,其中β控制收敛速率,C1,C2控制偏移,扩散曲线如下,第一组参数是sigmoid函数

在上面的推导过程中,没有用到网络的任何特性,好像与网络没有什么关系。下一篇博文中,将会探讨网络中传播率与上面曲线的关系。

曲线生成代码(R语言)

require(ggplot2)

# 传播率函数
i <- function(t, beta, c_1, c_2) {
  1 / (1 + (c_1 + c_2*beta)*exp(-beta*t))
}

# 曲线生成函数
curve_date <- function(t_seq, beta, c_1, c_2) {
  
  i_seq <- sapply(t_seq, i, beta, c_1, c_2)
  param <- sprintf("beta=%.2f,c1=%.2f,c2=%.2f", beta, c_1, c_2)
  data.frame(time=t_seq, rate=i_seq, type=param)
}

# 时间范围
t_seq <- seq(-50, 50, by=0.1)

# 生成数据
rst <- rbind(
  curve_date(t_seq, beta = 1, c_1 = 1, c_2 = 0),
  curve_date(t_seq, beta = 0.15, c_1 = 1, c_2 = 0),
  curve_date(t_seq, beta = 1, c_1 = 50, c_2 = 0),
  curve_date(t_seq, beta = 1, c_1 = 1, c_2 = 10)
)

# 绘图
p <- ggplot(rst, aes(x=time, y=rate, color = type))
p <- p + geom_line(size=1.5)
p <- p + guides(color = guide_legend(title = "参数组合"))
p <- p + ggtitle("传播速率曲线") + xlab("时间") + ylab("传播占比")
p <- p + scale_x_continuous(breaks=seq(min(t_seq),max(t_seq), by = 5))
p <- p + scale_y_continuous(breaks=seq(0,1, by = 0.1))
p <- p + theme(legend.text=element_text(size=15),
               text = element_text(size=15))
p