信息传播模型——SIR的Python实现

SIR SIRE 传染病预测模型与代码应用之概念篇 SIR模型概念 看到网上很多人在讲新冠的预测模型,主流的是SIR 与 SIRE, 这里大致记录一下我对传染病模型的理解。之后会陆续补充该模型的应用,扩展,以及code。 一、SIR的由来(网络资料): 该模型最早是在1760年于Daniel Bernoulli对于天花预防的研究中有所提到。该模型具体被引入是20世纪初基于Hamer、Ross等人在建立传染病数学模型的研究中做出了大量的工作,直到19... 阅读详情

本文通过Python语言实现SIR模型,并进行可视化,所用例子为足球俱乐部数据集。


@author:xiao黄
缓慢而坚定的生长


我之前还写过SI和IC模型的Python实现及可视化,请点击传送门查看,希望对你们有帮助。

SIR模型是传染病模型中最经典的一个。SIR是三个单词首字母的缩写,其中S是Susceptible的缩写,表示易感者;I是Infective的缩写,表示感染者;R是Removal的缩写,表示移除者。这个模型本身是在研究这三者的关系。在病毒最开始的时候,所有人都是易感者,也就是所有人都有可能中病毒;当一部分人在接触到病毒以后中病毒了,变成了感染者;感染者会接受各种治疗,最后变成了移除者。这三者的关系如下图所示:在这里插入图片描述
β:易感节点被成功感染的概率
γ:感染节点被治愈的概率

  • 代码里面有注释,如果看不懂可以留言,如果有错误也可以指出,谢谢
  • 介绍就上面一点,主要是看下面的代码

代码:

import io
import random
import urllib.request as urllib
import zipfile

import 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'] = 1
                    new_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)

代码运行结果:
在这里插入图片描述


有帮助的话,在这里点个赞再走呗~


信息传播模型实战:从SI、SIR到IC模型,Python代码解析与应用 信息传播模型是社交网络分析和计算社会学中的核心概念,它通过数学建模来量化信息在人群中的扩散过程。其基本原理是将个体抽象为网络节点,通过定义状态转换规则(如易感、感染、恢复)和传播概率,模拟信息沿社交关系的流动。这类模型的技术价值在于能将模糊的传播直觉转化为可预测、可量化的分析工具,广泛应用于舆情监控、病毒式营销、影响力最大化等场景。例如,SI模型适用于模拟永久性认知的扩散,SIR模型能刻画信息热度的生命周期,而IC模型则是解决“如何选择初始推广者以最大化覆盖”这一经典问题的基石。通过Python中的netw 阅读详情

相关推荐

用 SIR 模型拟合疫情感染情况

数据来源: 由于提供疫情数据的网站,本文选用的是腾讯新闻的实施更新,网站链接下: https://news.qq.com/zt2020/page/feiyan.htm#/global 抓取工具:python 和 jupyter notebook 抓取记录:由于该网页展现的只是当日的数据,所以我们要先通过查找网页源代码,找出包含中国及世界历史疫情数据的网页,以下有三个链接分别表示的是包 含中国各省市当日实时数据、包含中国历史数据及每日新增数据、包含世界历史 数据及每日新增数据的链接 https://v

m0_46488420的博客 6538

【保姆级教程】使用python实现SIR模型(包含数据集的制作与导入及最终结果的可视化)

使用python实现SIR传染病模型,详细介绍了数据集的制作与导入,整体模型框架,和最后以图片形式对结果进行呈现,并额外介绍了如何利用python制作散点图。

m0_65238732的博客 7725

关键节点组挖掘(附Python实现)

用Python实现图里的关键节点组挖掘

Wait_Godot的博客 1748

人群接触网络中的SIR疫情模拟——Python实现

SIR模型是一种传播模型,是传染病模型中最经典的模型,其中S表示易感者,I表示感染者,R表示移出者。

杨老师的小跟班(*∩_∩*) 4221

基于复杂网络的传染病传播模型研究 (2007年)

从复杂网络理论出发,通过建立复杂网络模型的方法模拟了传染病传播的过程,对 SARS的传播过程成功的进行了模拟,同时以此为基础对可能影响传染病的几种因素进行了具体的考察,如人员的隔离、及时就医等,考察了这些因素对控制传染病达到稳定的具体影响,并给出了一些控制这类问题的建议.

网络传播信息内容的可信度研究进展_吴连伟 (1)_传染病模型_传染病_传播模型_diseaseprediction_信息传播模型

基于传染病模型的信息传播模型。适用范围广泛。

利用python预测sir模型_SI,SIS,SIR模型的正确实现(python)

我已经创建了上述模型的一些非常基本的实现。然而,尽管图表看起来是正确的,但是数字加起来并不是一个常数。这是每个隔间中易感/受感染/康复的人的总和,应该是N(总人数),但它没有,因为某些原因,它加起来一些奇怪的十进制数,我真的不知道如何解决它,在看了3天之后。在SI模型:import matplotlib.pyplot as pltN = 1000000S = N - 1I = 1beta = 0....

weixin_31994237的博客 1820

从‘眼花缭乱’到‘心中有数’:rs-fMRI统计分析全流程避坑指南(附DPABI操作截图)

本文详细解析了rs-fMRI统计分析的全流程,从质量控制到统计模型选择,再到多重比较校正和结果解读。特别针对DPABI软件操作中的常见陷阱提供实用指南,帮助研究者避免FDR和GRF校正等关键环节的错误,实现从数据混乱到清晰分析的转变。

weixin_33686714的博客 400

SIR信息传播模型

SIR信息传播模型SIR模型及python复现SIR模型SIR数学模型 SIR模型及python复现 SIR模型 SIR模型是传染病模型中的经典模型,可以用在传染病过程中的模拟预测,也可以用作抽象表达社交网络中的信息传播过程,本文讲述的是后者。 SIR模型将社交网络中的节点分为三类:S类,易感染者,指未接收信息且不具备传播能力的节点;I类,感染者,指接收信息且具备传播能力的节点;R类,免疫者,指接收信息后退出传播过程的节点。 SIR数学模型 ...

weixin_44177875的博客 8816

ArcGIS图解建模工具与DEM提取山脊、山谷线(水文分析、表面分析)

参考汤国安、杨昕等编著的《地理信息系统空间分析实验教程第二版》 利用水文分析(流量)和表面分析(坡向变率)得到山脊和山谷线 文章目录1、基本概念1.1 正地形1.2 负地形正负地形的影响2、水文分析方法2.1 基本思想原理2.2 技术路线2.3 操作步骤2.3.1 正负地形的提取2.3.2 利用水文分析思想和工具提取研究区域的山脊线2.3.3 利用水文分析思想和工具提取研究区域的山谷线2.3.4 利用水文分析提取山脊线和山谷线结果3、表面分析方法3.1 基本思想原理3.2 技术路线3.3 操作步骤4、图.

fungis 1万+

NVIDIA NCCL 安装和测试实战教程

ibrary)是用于深度学习应用的高性能通信库,可加速多GPU通信和同步。它能够在多个GPU之间进行高效的数据传输和集体操作,显著提高了分布式GPU系统上深度学习训练和推理的性能。NVIDIA NCCL是加速多GPU系统上深度学习应用的必不可少的工具。其高效的通信原语和集体操作显著提高了分布式训练和推理的性能,使其成为现代深度学习基础架构的关键组成部分。

weixin_39818775的博客 4431

Python实现社交网络信息传播模型:SI、SIR与IC模型原理与应用

信息传播模型是研究信息、观点或行为在社交网络中扩散过程的数学框架,其核心原理基于图论与概率论,模拟个体节点间的状态转移。从经典的SI模型出发,通过引入恢复机制衍生出SIR模型,再到离散时间步的独立级联模型,这些模型构成了分析网络动力学的基础。在技术价值层面,它们为量化评估营销活动影响力、预测舆情走势、优化种子节点选择提供了可计算的方法论。在工程实践中,结合NetworkX构建网络拓扑,利用NumPy进行概率模拟,并通过Matplotlib实现过程可视化,是验证模型效果的关键步骤。具体到应用场景,SI模型适用

weixin_30753873的博客 463

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自:雷达学报作者:易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇雷达是信息感知的千里眼,具有极高的军用和民用价值,广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占的前沿技术,同时是信息科学的重要组成部分。随着科学技术不断进步,先进电子对抗装备的不断问世和广泛列装,雷达的生存与发展正面临日益严峻的挑战。从生存环境上看,雷达面临通信等各类民用电磁干扰以及复杂的军用电磁干扰;从探测对象上看,集群、微弱、隐身、高空、低空等多样化目标的出现也给雷达探测与识别带来困难。

renhongxia1的博客 2784

python代码实现, SIR 模型进行信息传播模拟

SIR模型是一种常用的信息传播模型,它用来模拟传染病(如冠状病毒)的流行情况。SIR模型包括三种状态: S(Susceptible):易感者,还没有患上传染病的人。 I(Infected):感染者,已经患上传染病的人。 R(Recovered):恢复者,已经患过传染病并康复的人。 SIR模型假设传染病是通过直接接触传播的,并且每个人只有在感染后才能被传染。因此,SIR模型可以用来模拟传染病的流...

weixin_42602368的博客 713

昇腾AI处理器Ascend C编程:从C/C++基础到高性能算子开发实战

异构计算是提升AI算力效率的核心技术,通过在CPU之外引入专用处理器(如GPU、NPU)协同工作,实现大规模并行计算。其原理在于将计算密集型任务卸载到专用硬件,利用其高并行架构加速处理。技术价值在于突破传统CPU的算力瓶颈,为深度学习训练与推理提供强大动力,广泛应用于模型部署、科学计算和高性能计算场景。本文聚焦昇腾AI处理器的原生编程语言Ascend C,它基于C/C++标准扩展,通过显式内存管理和任务并行模型,充分发挥达芬奇架构中Cube与Vector单元的性能。针对CANN算子开发,文章详解了从环境搭建

weixin_34411563的博客 368

AIDC智算中心建设:资源池化核心技术解析

AI 应用的POD在运行的时候,通过池化运行时访问虚拟GPU、执行AI任务,池化运行时拦截对虚拟GPU的访问请求、转递给池化服务代理执行,池化服务代理通过向智算池化控制器查询虚拟GPU所对应的真实智算资源位置、规格,按查询结果分配智算资源、执行AI任务,如果真实的智算资源位于远程计算节点,则由本地池化服务代理将访问请求转递给远程计算节点上的池化服务代理处理,相关通信经由参数面网络。

u013891230的博客 2431

社交网络分析——信息传播模型(附带三个模型的python实现)

摘要:主要讲解一些基本的信息传播模型,以及IC模型、SI模型和SIR模型的python实现及可视化。 author:xiao黄 缓慢而坚定的生长 最后更新于2020.10.06

小黄的博客 3万+

【OpenClaw企业级智能体实战】第27篇:Skill生态运营——企业私有Skill商店的搭建与审核机制

2026年ClawHavoc供应链攻击事件曝光超1200个恶意Skill渗透公共技能市场,工信部明确要求企业审慎使用第三方技能包并严格审查代码。本文基于真实安全事件与行业实践,完整讲解企业私有Skill商店从0到1搭建方案,覆盖小团队极简GitLab私有仓库、中大型企业Nacos 3.2私有Registry两种主流架构,配套企业级安全审核四步法、静态代码扫描规则、CI/CD自动化审计、数字签名校验与版本生命周期管理。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 501

社交网络分析——影响力最大化(附带python例子实现)

本文通过python实现影响力最大化模型,所用例子为空手道俱乐部。

小黄的博客 6386

DFIG风电场经LCC-HVDC外送系统SIMULINK建模与仿真

本文基于MATLAB/Simulink平台构建了DFIG风电场经LCC-HVDC外送系统的仿真模型。系统采用1000MW聚合DFIG模型与双极12脉动LCC-HVDC连接,详细阐述了参数设计、控制策略及接口协调方法。重点解决了风电场无功能力不足、功率波动影响换相等关键技术问题,为大规模风电基地外送提供了仿真研究框架。模型整合了官方DFIG和HVDC详细模块,通过参数缩放和控制系统优化,实现了完整系统的动态仿真分析。

huanghm88的专栏 121

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

玩具模型如何用SIR框架讲清疫情传播本质

玩具模型是一种面向理解而非预测的简化建模方法,其核心在于剥离冗余细节,聚焦系统最基础的状态转移逻辑。它以SIR(易感-感染-康复)三状态结构为骨架,通过感染率β与康复率γ两个关键参数,揭示传染病传播的数学内核——如基本再生数R₀=β/γ决定疫情能否扩散,群体免疫阈值H=1−1/R₀刻画防控临界点。这类模型虽不拟合高维现实,却能支撑政策推演、教学具象化和公众风险认知,广泛应用于公共卫生教育、应急决策沙盘及跨领域系统思维训练。本文基于可运行的Python实现与交互式Slider演示,详解如何用不到20行代码构建

aebe49167的博客 384

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

dnn模型 list index out of range_附源码|信息传播模型——SIR

本文主要讲解信息传播模型——SIR,以及模型的实现及可视化,所用例子为足球俱乐部数据集。我之前还写过SI和IC模型的Python实现及可视化,请点击传送门查看,希望对你们有帮助。SIR模型是传染病模型中最经典的一个。SIR是三个单词首字母的缩写,其中S是susceptible的缩写,表示易感者;I是Infective的缩写,表示感染者;R是Removal的缩写,表示移除者。这个模型本身是...

weixin_42509686的博客 129

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从游戏设计到社交网络:SIR模型如何帮你理解信息传播与用户增长

本文探讨了SIR模型在游戏设计和社交网络中的应用,帮助理解信息传播与用户增长。通过将人群划分为易感者、传播者和移除者,模型量化分析了用户行为与传播规律,并提供了Python模拟实例。文章还揭示了社交网络中的三大异常现象及改进方案,为产品决策提供数据支持。

weixin_30832405的博客 401

传染病传播模型 python_SIR信息传播模型

import networkx as nximport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport matplotlib.animation as animationimport random# 确保 中文 和 -plt.rcParams['font.sans-serif'] = ['SimHei']plt...

weixin_39744554的博客 446

复杂网络节点排序方法的评价-SIR传播曲线(Python)

1 SIR https://blog.youkuaiyun.com/weixin_40935887/article/details/114690294#SIR_1 2 SIR传播曲线 import networkx as nx import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator from SIR import SIR_networ

Morty的博客 2894

基于python多平台耦合信息传播

基于python进行模拟三个平台的信息传播,用户参数14亿,考虑平台对其他平台的信息管制,平台的活动引力,用户审美疲劳;基于多平台耦合信息传播动力学模型的信息传播分析方法。代码一些细节需要处理优化....和之前的SIR病毒感染有些相似。

2301_76444133的博客 262
上一篇: LeetCode|2.两数相加
下一篇: LeetCode|82. 删除排序链表中的重复元素 II
xiao黄
xiao黄 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域 领域专家: 数据科学与机器学习技术领域 领域专家: 数据科学与机器学习技术领域
博客等级 码龄8年 1万+粉丝 250原创
评论 35
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值