信息传播模型——SIR的Python实现
本文通过Python语言实现SIR模型,并进行可视化,所用例子为足球俱乐部数据集。
@author:xiao黄
缓慢而坚定的生长
我之前还写过SI和IC模型的Python实现及可视化,请点击传送门查看,希望对你们有帮助。
import io
import random
import urllib.request as urllib
import zipfileimport matplotlib.pyplot as plt
import networkx as nx
import numpy as np'''
author:xiao黄
time:2020-9-26
''''''
1 易感人群(Susceptible):指未得病者,但缺乏免疫能力,与感病者接触后容易受到感染。
2 感染人群(Infective):指染上传染病的人,他可以传播给易感人群。
3 移除人群(Removed):被移出系统的人。因病愈(具有免疫力)或死亡的人。这部分人不再参与感染和被感染过程。
N(t) = S(t) + I(t) + R(t)
S(t+1) = S(t) - αS(t)
I(t+1) = I(t) - βI(t)
R(t+1) = R(t) + βI(t)
'''max_iter_num = 200 # 模拟的次数
# G = nx.karate_club_graph() # 空手道俱乐部# 足球数据集
url = "http://www-personal.umich.edu/~mejn/netdata/football.zip"
sock = urllib.urlopen(url)
s = io.BytesIO(sock.read())
sock.close()
zf = zipfile.ZipFile(s)
gml = zf.read("football.gml").decode()
gml = gml.split("\n")[1:]
G = nx.parse_gml(gml) nums = G.number_of_nodes() # 足球数据节点 -> 115
print('总节点数',nums)alpha = 0.25 # 传染概率
beta = 0.65 # 治愈概率for edge in G.edges:G.add_edge(edge[0], edge[1], weight=random.uniform(0,1)) # 可不可以作为权值 病毒的感染能力
for node in G:G.add_node(node, state = 0) # 用state标识状态 state=0 易感 ,state=1 感染 , state=2 治愈seed = 'Arkansas' # 选定Arkansas作为传染源
G.node[seed]['state'] = 1 # 表示Arkansas是感染的 all_infect_nodes = [] # 所有被感染的节点放在这里
all_infect_nodes.append(seed)all_remove_nodes = [] # 所有被治愈的节点放在这里infect = [] # 随着迭代次数的增加的感染总人数
recover = [] # 随着迭代次数的增加的治愈总人数for i in range(max_iter_num):new_infect = list() # 新被感染的new_remove = list() # 新被治愈的# t1 = '%s time' % i + ' %s nodes' % len(all_infect_nodes)# print('当前感染节点数:', t1) # 当前有多少个节点被感染# t2 = '%s time' % i + ' %s nodes' % len(all_remove_nodes)# print('治愈节点数:', t2)infect.append(len(all_infect_nodes))recover.append(len(all_remove_nodes))# 感染的机会不止一次# 治愈后不会被感染for v in all_infect_nodes:for nbr in G.neighbors(v): # v的邻居if G.node[nbr]['state'] == 1: # 被感染edge_data = G.get_edge_data(v, nbr) # 得到边的权值if beta > edge_data['weight']: # 治愈概率G.node[nbr]['state'] == 2 # if nbr not in all_remove_nodes:new_remove.append(nbr)if G.node[nbr]['state'] == 0 :# 如果这个邻居节点没被感染且没有被治愈edge_data = G.get_edge_data(v, nbr)if alpha < edge_data['weight']:G.node[nbr]['state'] = 1new_infect.append(nbr)for i in new_remove:if i in new_infect:new_infect.remove(i)if i in all_infect_nodes: all_infect_nodes.remove(i)all_infect_nodes.extend(new_infect) # 将新感染的添加到all_remove_nodes.extend(new_remove)all_infect_nodes = list(set(all_infect_nodes)) # 去重all_remove_nodes = list(set(all_remove_nodes))# matplotlib中文支持
plt.rcParams['font.sans-serif'] = ['SimHei'] #aaaaa.py 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)def draw_picture(nums,max_iter_num,infect,recover):x = range(max_iter_num) susceptible = []for i in range(max_iter_num):susceptible.append(nums - infect[i] - recover[i])plt.figure(figsize=(8,6), dpi=300) # 图片大小,清晰度plt.plot(x,infect, color='r', label='感染数', linestyle='--',)plt.plot(x,recover, color='b', label='治愈数') # 可以修改颜色、线条风格、图例plt.plot(x,susceptible,color='g',label='易感数')plt.legend(loc='upper right') # 显示图例plt.xticks(range(0,max_iter_num,20)) # 修改x的刻度plt.yticks(range(0,nums,10)) # 修改y的刻度# 添加网格显示plt.grid(True, linestyle='--', alpha=0.5)# 添加x,y轴描述信息及标题plt.ylabel('数量')plt.xlabel('天数')# plt.title('对比')plt.show()draw_picture(nums,max_iter_num,infect,recover)
信息传播模型——SIR的Python实现相关推荐
- python代码信息传播模型
python代码信息传播模型是指使用python编写的程序来模拟信息传播的过程.这种模型可以用来研究信息如何在网络中传播,以及影响信息传播的因素. 例如,你可以使用python代码来模拟一个社交网络中 ...
- 复杂网络研究中的SIR传播模型(Python实现)
复杂网络研究中的传播模型SIR的Python实现 SIR 应用 SIR import random''' 程序主要功能 输入:网络图邻接矩阵,需要被设置为感染源的节点序列,感染率,免疫率,迭代次数st ...
- python代码实现, SIR 模型进行信息传播模拟
SIR模型是一种常用的信息传播模型,它用来模拟传染病(如冠状病毒)的流行情况.SIR模型包括三种状态: S(Susceptible):易感者,还没有患上传染病的人. I(Infected):感染者,已 ...
- 《改进SIR 模型在社交网络信息传播中的应用》仿真实现
摘要 基于<改进SIR 模型在社交网络信息传播中的应用>一文中提出的改进SIR模型,使用Matlab进行了仿真实现.另外,基于原文的模型,依据实际话题热度进行了其它仿真和分析. 背景 信息 ...
- 4 月 24 日开播!基于神经网络建模的信息传播预测
信息传播在我们的日常生活中无处不在,例如谣言的扩散.产品的推广以及新思想和新技术的普及等等,其建模和预测已经在多个重要领域内得到了广泛的研究.近年来,很多研究者利用以循环神经网络为主的深度学习模型对信 ...
- 【综述专栏】陈恩红: 社交网络的信息传播分析及其应用
本期聚焦中国科技大学陈恩红教授团队综述:社交网络信息传播分析中有哪些模型?如何基于网络结构评价用户的权威性和影响力?如何实现影响力最大化?未来还有哪些前景广阔的研究方向? Study on Infor ...
- 【文献综述】陈恩红: 社交网络的信息传播分析及其应用
Study on Information Diffusion Analysis in Social Networks and Its Applications https://mp.weixin.qq ...
- 传染病传播模型(含matlab代码)
2020年初,一种新型冠状病毒袭击了中国武汉. 随着卫生设施的改善.医疗水平的提高以及人类文明的不断发展,诸如霍乱.天花等曾经肆虐全球的传染性疾病已经得到有效的控制,但是一些新的.不断变异着的传染病毒 ...
- 【Python大作业】耦合网络信息传播
文章目录 前言 一.题目介绍 二.解题思路 1.构造一个耦合网络 ①构造ER网络 ②构造BA网络 ③双层ER-BA网络模型 2.利用SIR模型来模拟信息传播 3.画图 三.完整代码 四.结果分析 1. ...
最新文章
- JS实现-页面数据无限加载
- 反对迭代0:停止拖延,开始迭代
- Neighbor-Vote:使用邻近距离投票优化单目3D目标检测(ACM MM2021)
- oppo8.0系统手机(亲测有效)激活xposed框架的教程
- JSR303数据校验-2021新版
- 互联网晚报 | 4月15日 星期五 | 360推出元宇宙产品“N世界”;四川多地下调房贷利率;知情人士:上汽或推动复工复产...
- Linux通过GPIO状态实现按键上报(按键功能)
- linux进程网络流量使用查询,linux centos 查看进程网络流量状态、网络流量(使用nethogs、nload)...
- 计算机vfp程序设计题,2012年计算机级VFP程序设计基础习题及答案.doc
- Python闭包基本介绍与作用
- TCP协议中的三次握手和四次挥手(图解)【转】
- maven的Lifecycle生命周期
- Java 病毒感染检测
- html中的flash打不开,浏览器中flash插件被屏蔽怎么办?
- 微信公众号前端支付实现
- 高德地图经纬度比较并返回范围内要求个数可用
- Lisp真的是屠龙之技吗?
- AndrewNG机器学习听课笔记(1 )——线性回归(linear regression)
- 九、cadence ic 5141 ——反相器版图绘制
- 如何解决下载链接在微信中无法打开的问题
热门文章
- 2021-2025年中国非结构蛋白4B行业市场供需与战略研究报告
- 中兴 ZTE T9 七寸平板手机ROOT方法 教程分享
- VSCode更改主题背景
- 用AkShare获取沪深京A股所有股票历史数据
- 一个人怎么写大型软件
- Java+Python 微信公众号自动给女朋友推送专属浪漫早安问候
- 计算机基础为什么要学word,计算机基础中word教学探讨
- 2020.9.10丨Pacbio技术三代建库、测序原理
- Html是网页制作的核心语言吗,html网页设计报告总结.doc
- C++实现“23”抽签小游戏