SI模型

import numpy as np
import matplotlib.pyplot as plt
import smallworld as sw #邻接矩阵
a = sw.a
# 感染率
beta = sw.beta
#初始患者
origin = sw.origin def si_(a, beta, origin):
#总人数
n = a.shape[0]
#控制符
judge = 1
#未感染人群
s = np.arange(n)
s = np.delete(s, origin)
#上一轮或原先感染人群
i = origin
#感染者记录
r = []
#感染时间记录
t = []
#感染人数记录
speed = []
#计时器
h = 0
#总感染者
infected = i
#开始传播
while judge == 1:
temp_i = []
#感染人数
m = len(infected)
for j in range(0, m):
node = int(infected[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
#感染者邻接的未感染者
asd2 = np.intersect1d(asd, s)
#随机生成被感染率
num = np.random.rand(len(asd2)) - beta
#该感染者传播的新感染者
asd_final =[]
for k in range(0, len(asd2)):
if num[k] <= 0:
asd_final.append(asd2[k])
#这一轮总的新感染者
temp_i = np.union1d(temp_i, asd_final)
s = np.setdiff1d(s, asd_final) if len(i) > 0:
for k in range(0, len(i)):
r.append(i[k])
t.append(h)
#新一轮感染人群
i = temp_i
infected = np.union1d(infected, i)
#所有人都被感染则跳出循环
if len(s) == 0:
judge = 0
if len(i) > 0:
for k in range(0, len(i)):
r.append(i[k])
t.append(h)
speed.append(len(r))
h = h+1
coverage = r
for j in range(h, 2*h):
speed.append(speed[j-1])
print(speed)
plt.plot(speed, "-ro", label='Infectious')
plt.title('SI')
plt.legend()
plt.show() si_(a, beta, origin)

效果图:

SIR模型

import numpy as np
import matplotlib.pyplot as plt
import smallworld as sw #邻接矩阵
a = sw.a
#感染率
beta = sw.beta
#复原率
gama = sw.gama
#初始患者
origin = sw.origin def sir_(a, origin, beta, gama):
#总人数
n = a.shape[0]
#控制符
judge = 1
#未感染人群
s = np.arange(n)
s = np.delete(s, origin)
# 未感染人数记录
snum = list()
snum.append(len(s))
#感染人群
i = origin
#感染人数记录
inum = list()
inum.append(len(i))
#复原人群
r = []
#复原人数记录
rnum = list()
rnum.append(0)
#计时器
h = 1
#开始传播
while judge ==1:
#新一轮感染者
temp_i = []
m = len(i)
#感染
for j in range(0, m):
#感染者
node = int(i[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
#未被感染者且不为复原者
asd2 = np.intersect1d(asd, s)
asd2 = np.setdiff1d(asd2, r)
num = np.random.rand(len(asd2)) - beta
#新感染者
asd_final = []
for k in range(0, len(asd2)):
if num[k] <= 0:
asd_final.append(asd2[k])
temp_i = np.union1d(temp_i, asd_final)
s = np.setdiff1d(s, asd_final)
#复原
num = np.random.rand(m) - gama
asd = []
asd_final = []
for k in range(0, m):
if num[k] <= 0:
asd.append(k)
asd_final.append(i[k])
#原感染者部分复原
r = np.union1d(r, asd_final)
i = np.delete(i, asd)
#这一轮后总感染者
i = np.union1d(i, temp_i)
snum.append(len(s))
inum.append(len(i))
rnum.append(len(r))
h = h + 1
if len(i) == 0:
judge = 0
for j in range(h, h*2):
snum.append(snum[j-1])
inum.append(inum[j - 1])
rnum.append(rnum[j - 1])
plt.plot(snum, "-bo", label='Susceptibles')
plt.plot(inum, "-ro", label='Infectious')
plt.plot(rnum, "-go", label='Recovereds')
plt.title('SIR')
plt.legend()
plt.show() sir_(a, origin, beta, gama)

效果图:

SIS模型

import numpy as np
import matplotlib.pyplot as plt
import BA
import random #邻接矩阵
a = BA.a
#感染率
beta = 0.6
#复原率
gama = 0.3
#初始感染者
origin = random.sample(range(0, a.shape[0]), 5) def sis_(a, origin, beta, gama):
#总人数
n = a.shape[0]
#未感染人群
s = np.arange(n)
s = np.delete(s, origin)
#感染人群
i = origin
#感染人数记录
speed = []
speed.append(len(i))
#计时器
h = 1
while h < 70:
temp_i = []
m = len(i)
for j in range(0, m):
node = int(i[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
asd2 = np.intersect1d(asd, s)
num = np.random.rand(len(asd2)) - beta
asd_final = []
for k in range(0, len(asd2)):
if num[k] <= 0:
asd_final.append(asd2[k])
temp_i = np.union1d(temp_i, asd_final)
s = np.setdiff1d(s, asd_final)
num = np.random.rand(m) - gama
asd = []
asd_final = []
for j in range(0, m):
if num[j] <= 0:
asd.append(j)
asd_final.append(i[j])
s = np.union1d(s, asd_final)
i = np.delete(i, asd)
i = np.union1d(i, temp_i)
speed.append(len(i))
h = h + 1 snum = []
for j in range(0, h):
snum.append(n - speed[j])
plt.plot(speed, "-ro", label='Infectious')
plt.plot(snum, "-bo", label='Susceptibles')
plt.title('SIS')
plt.legend()
plt.show() sis_(a, origin, beta, gama)

效果图:

LT模型

import numpy as np
import smallworld as sw
import networkx as nx
import matplotlib.pyplot as plt #邻接矩阵
a = sw.a
#节点度数, 1/b是其他节点对该节点的影响力
b = sw.b
#节点阀值
beta = sw.beta
#原激活节点
origin = sw.origin #超过beta(如50%)的邻接节点处于激活状态,该节点才会进入激活状态 def lt_(a, b, origin, beta):
#节点数
n = a.shape[0]
#控制符
judge = 1
#未激活节点
s = np.arange(n)
s = np.delete(s, origin)
#激活节点
i = origin
while judge == 1:
#该轮激活节点
temp_i = []
#激活节点个数
m = len(i)
for j in range(0, m):
node = int(i[j])
asd = []
for k in range(0, n):
if a[node, k] == 1:
asd.append(k)
#找到相邻的未激活节点
asd2 = np.intersect1d(asd, s)
asd_final = []
for k in range(0,len(asd2)):
num = 0
#该未激活节点相邻的激活节点个数
for t in range(0, m):
if a[int(i[t]), asd2[k]] == 1:
num = num + 1
if 1 / b[asd2[k]] * num >= beta:
asd_final.append(asd2[k])
temp_i = np.union1d(temp_i, asd_final)
s = np.setdiff1d(s, asd_final)
#将新激活节点合并到原激活节点中
i = np.union1d(i, temp_i)
#如果该轮没有新激活节点,那之后都不会再有,跳出循环
if len(temp_i) == 0:
judge = 0
#输出新的网络状况
color = []
for j in range(0, n):
color.append('b')
for j in range(0, len(i)):
color[int(i[j])] = 'r'
g = nx.from_numpy_matrix(a)
nx.draw(g, with_labels=True, node_color=color)
plt.show() lt_(a, b, origin, beta)

效果图:

数据生成代码(WS)

import numpy as np
import random
import networkx as nx
import matplotlib.pyplot as plt n = 50
k = 5
p = 0.1 #建立小世界网
def sw_(n, k, p):
m = np.zeros((n, n), dtype=int)
#节点度数
d = np.zeros(n, dtype=int)
#构建环形网络
for i in range(0, n):
for j in range(0, n):
if j > i and j <= i+k:
m[i, j] = 1
m[j, i] = 1
d[i] = d[i] + 1
d[j] = d[j] + 1
if i+k >= n and j <= i+k-n:
m[i, j] = 1
m[j, i] = 1
d[i] = d[i] + 1
d[j] = d[j] + 1
#讲规则网络转换为随机网络
for i in range(0, n):
for j in range(0, n):
if m[i, j] == 1:
rand_num1 = np.random.rand(1)
if rand_num1 <= p:
rand_num2 = np.random.rand(1)
temp = np.random.permutation(np.arange(n))
if rand_num2 < 0.5:
for l in range(0, n):
if i != temp[l] and m[i, temp[l]] == 0:
m[i, temp[l]] = 1
m[temp[l], i] = 1
d[j] = d[j] - 1
d[temp[l]] = d[temp[l]] + 1
break
else:
for l in range(0, n):
if j != temp[l] and m[j, temp[l]] == 0:
m[j, temp[l]] = 1
m[temp[l], j] = 1
d[i] = d[i] - 1
d[temp[l]] = d[temp[l]] + 1
break
m[i, j] = 0
m[j, i] = 0
return m, d a, b = sw_(n, k, p) #LT预设
#预设阀值
beta = 0.5
#初始激活节点
q = np.random.randint(10, 15)
origin = random.sample(range(0, n), q)

网络传播模型Python代码实现的更多相关文章

  1. python网络编程——网络IO模型

    1 网络IO模型介绍 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:    (1)同步阻塞IO(Blocking IO):即传统的IO模型.    (2)同步非阻塞IO(Non-bl ...

  2. 数学建模python matlab 编程(疾病传播模型)

    例12:一只游船上有800(1000)人,一名游客不慎患传染病,12(10)小时后有3人发病,由于船上不能及时隔离,问经过60(30)小时,72小时,患此病的人数.(与人口模型和Logistic模型类 ...

  3. 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码

    上篇介绍了隐马尔科夫模型 本文给出关于问题3解决方法,并给出一个例子的python代码 回顾上文,问题3是什么, 下面给出,维比特算法(biterbi) algorithm 下面通过一个具体例子,来说 ...

  4. 导出pb模型之后测试的python代码

    链接:https://blog.csdn.net/thriving_fcl/article/details/75213361 saved_model模块主要用于TensorFlow Serving.T ...

  5. 一个 11 行 Python 代码实现的神经网络

    一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...

  6. 基于深度学习的人脸性别识别系统(含UI界面,Python代码)

    摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...

  7. 学习TensorFlow,浅析MNIST的python代码

    在github上,tensorflow的star是22798,caffe是10006,torch是4500,theano是3661.作为小码农的我,最近一直在学习tensorflow,主要使用pyth ...

  8. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  9. 教你用一行Python代码实现并行(转)

    教你用一行Python代码实现并行 本文教你通过一行Python实现并行化. Python在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题. ...

随机推荐

  1. 这7个npm命令将帮助您节省时间

    作为JavaScript开发人员,NPM是我们一直使用的东西,并且我们的脚本在终端上连续运行. 如果我们可以节省一些时间呢? 1.直接从npm打开文档 如果我们可以直接使用npm跳转到软件包的文档怎么 ...

  2. NestedScrollView、ScrollView 加载完自动滑动至底部问题的解决方案

    正常情况下,由于NestedScrollView/ScrollView 嵌套RecyclerView,可能会导致Recyclerview占据焦点导致整个NestedScrollView/ScrollV ...

  3. 【Beta阶段】第十二周Scrum会议

    [Beta阶段]第十二周Scrum会议 本次会议为第十二周第一次Scrum Meeting,会议对Beta阶段工作进行了总结,针对Beta阶段还未完成的问题进行了讨论. 会议时间为2019.12.3. ...

  4. 三、VUE项目BaseCms系列文章:axios 的封装

    项目开发中 ajax 是不可缺少的,一个好的封装可以减少我们很多的重复代码,维护也更方便.在 vue 开发中我们用的比较多的就是 axios.下面代码是项目中用到的 axios 的封装. http.j ...

  5. SQL Server解惑——为什么你的查询结果超出了查询时间范围

    废话少说,直接上SQL代码(有兴趣的测试验证一下),下面这个查询语句为什么将2008-11-27的记录查询出来了呢?这个是同事遇到的一个问题,个人设计了一个例子. USE AdventureWorks ...

  6. C# 类库项目 无法创建 “资源字典” 文件

    1.接触WPF有两个月时间了,准备自己写一个样式库,在vs新建 类库项目后无法创建资源字典. 2.解决办法: 打开项目工程文件      (  project.csproj) 在 <Proper ...

  7. s3c2440裸机-代码重定位、清bss的改进和位置无关码

    1.代码重定位的改进 用ldr.str代替ldrb, strb加快代码重定位的速度. 前面重定位时,我们使用的是ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDR ...

  8. Redis入门(二)-Redis能够做什么

    引言 在上篇文章中,我们讲述了Redis的基本知识让读者对Redis有了基本的了解.那么这一节我们就来看一下Redis究竟能做什么. 上一节我们提到了Redis可用作数据库,高速缓存和消息队列代理.这 ...

  9. Linux系统:Centos7环境搭建Redis单台和哨兵集群环境

    本文源码:GitHub·点这里 || GitEE·点这里 一.环境和版本 Linux:centos7 三台 三台Linux服务 192.168.72.129 192.168.72.130 192.16 ...

  10. Java中间消息件——ActiveMQ入门级运用

    先来说一说我们为什么要用这个东西啊! 比如,我们现在有这样了个问题要解决: 这样,我们就要用到中间消息间了 然后我们就说一下什么是中间消息间吧. 采用消息传送机制/消息队列 的中间件技术,进行数据交流 ...