计算网络中节点的SIR值(Python)
1 SIR模型代码
复杂网络研究中的SIR传播模型(Python实现)_Morty的博客-CSDN博客
2 计算每个节点的SIR值
import networkx as nx
import numpy as np
import pandas as pd
# 引入1中的SIR代码,也可直接复制粘贴到本代码中
from SIR import SIR_network
if __name__ == '__main__':
'''
数据准备。更换为自己的数据文件!!!
'''
adj = np.loadtxt('data/adj.txt', dtype=np.int) # 网络的邻接矩阵
graph = nx.from_numpy_matrix(adj) # 网络图:默认无向图;nx.DiGraph(adj)为创建有向图
nodes_n = adj.shape[0] # 行数,节点数
print('共 ' + str(nodes_n) + ' 个节点!')
'''
SIR传播
'''
dfSIR = pd.DataFrame(columns=['Id', 'SIR'])
str_fm = "{0:^5}\t{1:^10}" # 格式化输出
print(str_fm.format("Id", "SIR"))
# 循环所有节点
for j in range(nodes_n):
node_id = j + 1 # 索引序列[0~n-1],此处+1转回为Id
# 由于SIR为概率模型,我们进行多次实验取平均值,实验次数可自行设置
n = 100 # 实验次数
sir_list = []
for k in range(n):
# SIR参数设置,可自行设置
beta = 0.1 # 感染率
gamma = 0.5 # 免疫率
step = 20 # SIR模型中的感染传播轮次
# 节点的感染情况
sir_source = [j] # 方法输入为数组,将节点强制转换为数组,且SIR实现中使用的为节点索引号[0~n-1],此处使用j索引号
sir_values = SIR_network(graph, sir_source, beta, gamma, step)
Fc = sir_values[step - 1] # 最终的感染范围
# 由于有概率出现节点直接免疫,传播停止的“异常”情况
# 我们设置阈值,只统计传播覆盖范围大于1%(0.01)的情况
if Fc > 0.01:
sir_list.append(Fc)
sir = np.mean(sir_list) # 对100实验的输出结果求均值
print(str_fm.format(node_id, sir, chr(12288)))
# 添加至dataframe
dfSIR = dfSIR.append({
'Id': int(node_id),
'SIR': sir
}, ignore_index=True)
'''
输出到文件。更换为自己的数据文件!!!
'''
dfSIR.to_csv('result/Node-SIR.csv', index=False)