计算网络中节点的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)