摘要:主要讲解一些基本的信息传播模型,以及IC模型、SI模型和SIR模型的python实现及可视化。


  • 2021.10.06更新
  • 有需要的可以点击传送门

  • 2020.09.26更新
  • 更新了SIR模型的实现,请点击传送门,就不放在这篇博客里了

  • 2020.09.03更新
  • 更新了SI模型和IC模型用不同颜色表示每次激活的节点,在本文最后

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


信息传播模型

影响力模型

  • IC模型
  • LT模型

传染模型

  • SI模型
  • SIR模型
  • SIS模型
  • SIRS模型

Influence Models

  • 影响模型可模拟用户如何影响网络中的每个人
  • 节点有两个状态
    未激活:节点未收到信息
    激活:节点收到信息并且能够传播给他们的邻居

Independent Cascade (IC) Model

  • 在 t 时刻被激活的节点在 t+1 时刻仅有一次机会去激活其邻居
  • 假设节点 v 在 t 时刻被激活,对于 v 的任何邻居 w ,w 在 t+1 时刻被激活的概率是PvwPvwPvw
  • 如果是无权重的话,可以都设置为0.5,那么这样传播与不传播的概率就是一半一半了

例子

Liner Threshold (LT) Model

  • 在任意时刻,激活的点都可以影响未被激活的点
  • 每个节点都有激活阈值
  • 如果影响程度超过该节点的阈值,则这节点被激活

Infection Models

  • 传染模型也叫流行病模型,用于描述个人传播传染病的方式
  • 节点有两种状态
    易感人群:易感节点可能会感染疾病
    感染人群:感染节点有机会去感染易感人群
    免疫人群:感染节点被治愈后不会再得疾病的人群

Susceptible Infected (SI) Model

  • 节点有两个状态
    易感节点(S)
    感染节点(I)
  • 如何传染
    一个节点被感染,它将持续传染周围的节点
    在每个离散时间中,每个被感染的节点尝试以概率p去感染它的易感(未感染)邻居

Susceptible Infected Recovered (SIR) Model

  • Intuition:一些被感染的节点以一定的概率成为免疫节点,免疫节点不能被感染疾病或者传播疾病
  • 节点有三种状态:
    易感节点;感染节点;免疫节点
  • 节点的变化

    β:易感节点被成功感染的概率
    γ:感染节点被治愈的概率

Susceptible Infected Susceptible (SIS) Model

  • Intuition:感染节点以一定的概率变成易感节点,又有一定的概率被感染成感染节点
  • 节点有两种状态
    易感节点;感染节点
  • 节点的变化

    β:易感节点被成功感染的概率
    γ:感染节点被治愈成易感节点的概率

Susceptible Infected Recovered Susceptible (SIRS) Model

  • Intuition:免疫节点有一定的概率变成易感节点
  • 节点的变化

    β:易感节点被成功感染的概率
    γ:感染节点被治愈成免疫节点的概率
    λ:免疫节点有一定的概率转化成易感节点

IC模型的python实现

先上代码,这里我就不解释了,代码里面的注释我觉得很详细了,不懂可以评论或者私信。

import randomimport matplotlib.pyplot as plt
import networkx as nx
import numpy as npmax_iter_num = 10 # 模拟的次数
G = nx.karate_club_graph() # 空手道俱乐部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 激活seed = 33 # 选定33作为初始激活节点
G.node[seed]['state'] = 1 # 表示33被激活activated_graph = nx.Graph() # 被激活的图
activated_graph.add_node(seed)all_active_nodes = [] # 所有被激活的节点放在这里
all_active_nodes.append(seed)start_influence_nodes = [] # 刚被激活的节点 即有影响力去影响别人的节点
start_influence_nodes.append(seed)for i in range(max_iter_num):new_active = list()t1 = '%s time' % i + ' %s nodes' % len(all_active_nodes)print(t1) # 当前有多少个节点激活# 画图plt.title(t1)nx.draw(activated_graph, with_labels=True)plt.show()for v in start_influence_nodes:for nbr in G.neighbors(v): if G.node[nbr]['state'] == 0: # 如果这个邻居没被激活edge_data = G.get_edge_data(v, nbr)if random.uniform(0, 1) < edge_data['weight']:G.node[nbr]['state'] = 1new_active.append(nbr)activated_graph.add_edge(v, nbr) # 画图 添加边start_influence_nodes.clear() # 将原先的有个影响力的清空start_influence_nodes.extend(new_active) # 将新被激活的节点添加到有影响力all_active_nodes.extend(new_active) # 将新被激活的节点添加到激活的列表中print('all_active_nodes',all_active_nodes) # 打印

程序运行结果图:

节点图,这里我就放了9张,第十张不放了,你们运行的时候会看到的

SI模型的python实现

先上代码,这里我就不解释了,代码里面的注释我觉得很详细了,不懂可以评论或者私信。

import randomimport matplotlib.pyplot as plt
import networkx as nx
import numpy as npmax_iter_num = 5 # 模拟的次数
G = nx.karate_club_graph() # 空手道俱乐部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 激活seed = 33 # 选定33作为传染源
G.node[seed]['state'] = 1 # 表示33是感染的all_infect_nodes = [] # 所有被感染的节点放在这里
all_infect_nodes.append(seed)infected_graph = nx.Graph() # 被激活的图
infected_graph.add_node(seed)for i in range(max_iter_num):new_infect = list() # 新被感染的t1 = '%s time' % i + ' %s nodes' % len(all_infect_nodes)print(t1) # 当前有多少个节点被感染# 画图plt.title(t1)nx.draw(infected_graph, with_labels=True)plt.show()# 感染的机会不止一次for v in all_infect_nodes:for nbr in G.neighbors(v):if G.node[nbr]['state'] == 0: # 如果这个邻居节点没被感染edge_data = G.get_edge_data(v, nbr)if random.uniform(0, 1) < edge_data['weight']:G.node[nbr]['state'] = 1new_infect.append(nbr)infected_graph.add_edge(v, nbr) # 画图 添加边all_infect_nodes.extend(new_infect) # 将新感染的添加到print('all_active_nodes:', all_infect_nodes)

运行结果:

节点效果图:

IC模型的python实现更新版(2020.09.03)

import randomimport matplotlib.pyplot as plt
import networkx as nx
import numpy as npmax_iter_num = 10 # 模拟的次数
G = nx.karate_club_graph() # 空手道俱乐部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 激活seed = 33 # 选定33作为初始激活节点
G.node[seed]['state'] = 1 # 表示33被激活# activated_graph = nx.Graph() # 被激活的图
# activated_graph.add_node(seed)all_active_nodes = [] # 所有被激活的节点放在这里
all_active_nodes.append(seed)start_influence_nodes = [] # 刚被激活的节点 即有影响力去影响别人的节点
start_influence_nodes.append(seed)color_list = ['brown','orange','r','g','b','y','m','gray','black','c','pink','brown','orange','r','g','b','y','m','gray','black','c','pink']
res = [[seed]]
for i in range(max_iter_num):new_active = list()t1 = '%s time' % i + ' %s nodes' % len(all_active_nodes)print(t1) # 当前有多少个节点激活# 画图# plt.title(t1)# nx.draw(activated_graph, with_labels=True,node_color=color_list[i])# plt.show()for v in start_influence_nodes:for nbr in G.neighbors(v): if G.node[nbr]['state'] == 0: # 如果这个邻居没被激活edge_data = G.get_edge_data(v, nbr)if random.uniform(0, 1) < edge_data['weight']:G.node[nbr]['state'] = 1new_active.append(nbr)# activated_graph.add_edge(v, nbr) # 画图 添加边print('激活',new_active)start_influence_nodes.clear() # 将原先的有个影响力的清空start_influence_nodes.extend(new_active) # 将新被激活的节点添加到有影响力all_active_nodes.extend(new_active) # 将新被激活的节点添加到激活的列表中res.append(new_active)print('all_active_nodes',all_active_nodes) # 打印
# print(res)res = [c for c in res if c]
pos = nx.spring_layout(G) # 节点的布局为spring型
nx.draw(G,pos, with_labels=True, node_color='w', node_shape = '.')
color_list = ['brown','orange','r','g','b','y','m','gray','black','c','pink','brown','orange','r','g','b','y','m','gray','black','c','pink']
for i in range(len(res)):nx.draw_networkx_nodes(G, pos, with_labels=True, node_color=color_list[i], nodelist=res[i])
plt.show()

结果图:

SI模型的python实现更新版(2020.09.03)

import randomimport matplotlib.pyplot as plt
import networkx as nx
import numpy as npmax_iter_num = 5 # 模拟的次数
G = nx.karate_club_graph() # 空手道俱乐部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 激活seed = 33 # 选定33作为传染源
G.node[seed]['state'] = 1 # 表示33是感染的all_infect_nodes = [] # 所有被感染的节点放在这里
all_infect_nodes.append(seed)
res = [[seed]]# infected_graph = nx.Graph() # 被激活的图
# infected_graph.add_node(seed)for i in range(max_iter_num):new_infect = list() # 新被感染的t1 = '%s time' % i + ' %s nodes' % len(all_infect_nodes)print(t1) # 当前有多少个节点被感染# 画图# plt.title(t1)# nx.draw(infected_graph, with_labels=True)# plt.show()# 感染的机会不止一次for v in all_infect_nodes:for nbr in G.neighbors(v):if G.node[nbr]['state'] == 0: # 如果这个邻居节点没被感染edge_data = G.get_edge_data(v, nbr)if random.uniform(0, 1) < edge_data['weight']:G.node[nbr]['state'] = 1new_infect.append(nbr)# infected_graph.add_edge(v, nbr) # 画图 添加边res.append(new_infect)all_infect_nodes.extend(new_infect) # 将新感染的添加到print('all_active_nodes:', all_infect_nodes)res = [c for c in res if c]
pos = nx.spring_layout(G) # 节点的布局为spring型
nx.draw(G,pos, with_labels=True, node_color='w', node_shape = '.')
color_list = ['brown','orange','r','g','b','y','m','gray','black','c','pink','brown','orange','r','g','b','y','m','gray','black','c','pink']
for i in range(len(res)):nx.draw_networkx_nodes(G, pos, with_labels=True, node_color=color_list[i], nodelist=res[i])
plt.show()

结果:

  • 说在最后,因为是随机的,所以每次运行的结果可能是不一样的

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

  1. 人工智能目标检测模型总结(三)——yolov1模型(2)

    前言 当我们谈起计算机视觉时,首先想到的就是图像分类,没错,图像分类是计算机视觉最基本的任务之一,但是在图像分类的基础上,还有更复杂和有意思的任务,如目标检测,物体定位,图像分割等,见图1所示.其中目 ...

  2. 人工智能目标检测模型总结(三)——yolov1模型(1)

    目录 1. 创新 2. 核心思想 2.1 网络定义 2.2 输出representation定义 2.3 Loss函数定义 2.4 训练 3. 效果 4. 改进 5. 实践 Ref. Paper 从五 ...

  3. python代码信息传播模型

    python代码信息传播模型是指使用python编写的程序来模拟信息传播的过程.这种模型可以用来研究信息如何在网络中传播,以及影响信息传播的因素. 例如,你可以使用python代码来模拟一个社交网络中 ...

  4. 【Python大作业】耦合网络信息传播

    文章目录 前言 一.题目介绍 二.解题思路 1.构造一个耦合网络 ①构造ER网络 ②构造BA网络 ③双层ER-BA网络模型 2.利用SIR模型来模拟信息传播 3.画图 三.完整代码 四.结果分析 1. ...

  5. 从信息传播角度来看链路预测

    标题 利用动态网络中的信息扩散过程来评估链路预测 文献 Vega-Oliveros, D. A., Zhao, L., & Berton, L. (2019). Evaluating link ...

  6. EM算法初探——公式推导和三硬币模型解析

    EM算法初探--公式推导和三硬币模型解析 转载借鉴:http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html#!comments ...

  7. Stata——固定效应模型、随机效应模型、混合效应模型(区别、实例)

    目录 1 固定效应模型概念(Fixed Effects Model) 1.1  stata命令 1.1.1 LSDV法(Least squares dummy variable) 1.1.2 固定效应 ...

  8. 《改进SIR 模型在社交网络信息传播中的应用》仿真实现

    摘要 基于<改进SIR 模型在社交网络信息传播中的应用>一文中提出的改进SIR模型,使用Matlab进行了仿真实现.另外,基于原文的模型,依据实际话题热度进行了其它仿真和分析. 背景 信息 ...

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

    SIR模型是一种常用的信息传播模型,它用来模拟传染病(如冠状病毒)的流行情况.SIR模型包括三种状态: S(Susceptible):易感者,还没有患上传染病的人. I(Infected):感染者,已 ...

  10. 信息传播学习笔记(1)——SIS模型原理与公式推导

    本文是SIS模型的原理与公式推导,不涉及代码(后续补充). 对了宝贝儿们,卑微小李的公众号[野指针小李]已开通,期待与你一起探讨学术哟~摸摸大! 目录 1 背景 2 SIS模型原理 3 求解微分方程 ...

最新文章

  1. pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装
  2. [register]-ARMV8-aarch64 部分系统寄存器总结(必背)
  3. dubbo使用遇到的问题
  4. centos安装mysql wsl_如何在 Windows 10 中安装 WSL2 的 Linux 子系统
  5. python 链表推导式_五--python之数据结构(Data Structures)
  6. 如何保护电路不被烧毁?
  7. 如何安装Favicon
  8. 前端怎么自我介绍_未雨绸缪,小米前端实习面经
  9. docker安装jdk8
  10. 水系图一般在哪里找得到_广东工业大学《JACS》:一种全新的高性能水系可充电铝离子电池!...
  11. 文件系统功能 os模块 子模块os.path pickle
  12. Robomaster视觉教程(二)Win10+VS201x+Opencv3.4.x环境搭建
  13. 自建服务器部署WEB网站可公网访问
  14. CAD注记层转到SDE Annotation Features(ArcEngine,C++实现)(转载)
  15. LMG3410R050功率放大级解决方案
  16. Mathorcup数学建模竞赛第六届-【妈妈杯】A题:基于模糊综合评价和灰色关联度的淡水养殖池塘水华分析、预测及净化模型(附一等奖获奖论文和matlab代码)
  17. 广州大学纺织服装学院计算机应用,广州大学纺织服装学院代码是多少
  18. pytorch中的一维数组,是列向量还是行向量?
  19. 关于保险和理财,我是这么看的
  20. 物联网平台行业类型划分:CMP、DMP、AEP、BAP

热门文章

  1. 前照灯检测仪_前照灯检测仪
  2. 苏宁成立快递员节PK京东封杀快递,谁的做法更聪明?
  3. 随机字符 php,PHP生成随机字符
  4. 华为手机热点无法连接_华为手机热点无法连接
  5. ug打开服务器文件保存不了,UG突然说保存不了, 你都是怎么处理的呢?
  6. linux dump备份svn,svnadmin dump+load库中的某个目录用svndumpfilter 可实现
  7. EEGLAB教程-1.2通道定位
  8. 各地的磁倾角_全国各地区地磁场强度表
  9. IDEA 开启远程调试
  10. 【算法4总结】第一章:基础