复杂网络节点排序方法的评价-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” 文件描述:各节点在不同指标下的指标值。