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

1. SIR

https://blog.csdn.net/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_network

# SIR参数设置
beta = 0.1  # 感染率
gamma = 0.5  # 免疫率
step = 20  # 迭代次数

markers = ['<', '>', '^', 'v', 'o', 's', 'D', '*', 'x', '+']  # plt marker大全

# 获得所需的top-k节点
def getTopK(methods, k):
    print('Top-' + str(k) + '节点生成中...')
    df = pd.DataFrame(columns=methods_name)  # 存储各个方法的top-k节点
    # 循环每一个方法
    for i in range(len(methods_name)):
        method = methods.iloc[:, i + 1]  # 方法列
        top_K = method.argsort()[::-1][0:k]  # top-k,此处为索引号,与Id号差1
        df[methods_name[i]] = top_K  # 存储到dataframe
    return df


if __name__ == '__main__':
    dataset = 'dataset'  # 数据集/网络名称
    # 数据
    adj = np.loadtxt('adj.txt', dtype=np.int)  # 邻接矩阵
    metheds = pd.read_csv('多方法排序.csv')  # 多种方法的排序结果

    graph = nx.from_numpy_matrix(adj)  # 网络图
    # 读取方法文件的列名
    methods_name = np.array(metheds.columns)[1: len(metheds.columns)]
    print('文件中共有以下 ' + str(len(methods_name)) + ' 种方法')
    print(methods_name)

    # 选择需要画图显示的方法,可自行调整,也可设置为手动输入
    plt_methods = [1, 4, 5]

	# 可自行设置Top-K的具体k值
    for k in range(5, 20, 5):
        print('Top-%d...' % k)
        df = getTopK(metheds, k)  # 多种方法的Top-k结果

        sir_values_list = []  # 存储在该Top-k下各方法的sir感染情况
        # 循环所有方法
        for name in methods_name:
            sir_source = np.array(df[name])  # df转为数组
            sir_values = SIR_network(graph, sir_source, beta, gamma, step)  # sir传播
            sir_values_list.append(sir_values)  # 存储每个方法的Sir传播情况

        # 输出F(tc)
        for i in plt_methods:
            print(methods_name[i], sir_values_list[i][step])

        # SIR传播曲线结果可视化
        fig = plt.figure(figsize=(10, 6), dpi=150)  # 创建画布
        plt.title(dataset + ' Top-' + str(k))   # 设置标题
        plt.xticks(fontproperties='Times New Roman', size=16)  # 设置字体
        plt.yticks(fontproperties='Times New Roman', size=16)  # 设置字体
        plt.xlabel('t', fontproperties='Times New Roman', size=16)  # x轴标题
        plt.ylabel('F(t)', fontproperties='Times New Roman', size=16)  # y轴标题:第t个时间迭代步时的感染态和免疫态的数量之和F(t)
        ax = plt.gca()  # ax为两条坐标轴的实例
        ax.xaxis.set_major_locator(MultipleLocator(2))  # 把x轴的刻度间隔设置为2,并存在变量里

        plt_labels = []	# 存储需要plt的方法名,在图例中进行设置
        # 画图
        for i in plt_methods:
            plt.plot(range(step + 1), sir_values_list[i], marker=markers[i], linewidth=1.5, ms=10)
            plt_labels.append(methods_name[i])
        
        # 添加图例
        plt.legend(labels=plt_labels,
                   prop={'family': 'Times New Roman',
                         'weight': 'normal',
                         'size': 16},
                   loc="lower right")
        plt.show()

3. 效果图

 “多方法排序.csv” 文件描述:各节点在不同指标下的指标值。