Python运用si感染模型感染导入的'football.edge'数据集,输出打印节点感染状态和邻居,之后设置观测节点,利用反向传播算法即定义为定位源的反向传播初始时间的方差来定位,输出定位结果并可视化
时间: 2023-12-03 18:43:34 浏览: 91
基于 Python 实现疫情传播模拟系统【100011091】
下面是一个Python示例代码,实现了使用SI感染模型感染导入的football.edge数据集,并使用反向传播算法定位源的过程,最终输出定位结果并可视化:
```python
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
# 读取数据集
G = nx.read_edgelist('football.edge')
# 初始化节点状态
status = np.zeros(G.number_of_nodes())
# 随机选择一个节点作为感染源
source_node = np.random.choice(list(G.nodes()))
# 将感染源节点的状态设置为1
status[source_node] = 1
# 定义SI模型中的传播概率
beta = 0.3
# 迭代感染过程
while True:
new_status = np.copy(status)
for node in G.nodes():
if status[node] == 0: # 只考虑未感染的节点
neighbors = list(G.neighbors(node))
infected_neighbors = [n for n in neighbors if status[n] == 1]
if len(infected_neighbors) > 0:
# 如果有感染邻居,则以beta的概率感染该节点
if np.random.rand() < beta:
new_status[node] = 1
if np.array_equal(status, new_status):
break # 所有节点都已经感染
status = new_status
# 输出节点感染状态和邻居
print('节点感染状态:')
for node in G.nodes():
print('{}: {}'.format(node, '感染' if status[node] == 1 else '未感染'))
print('邻居:{}'.format(list(G.neighbors(node))))
# 设置观测节点
observed_nodes = [0, 5, 10]
# 反向传播算法
def backward_pass(observed_nodes, initial_time_variance):
n = G.number_of_nodes()
t = np.zeros(n)
t[observed_nodes] = 0 # 观测节点时间为0
for i in range(n):
if i not in observed_nodes:
neighbors = list(G.neighbors(i))
neighbor_times = [t[j] for j in neighbors]
if len(neighbor_times) > 0:
# 计算平均时间和方差
mean_time = np.mean(neighbor_times)
time_variance = np.var(neighbor_times)
# 反向传播计算时间
t[i] = mean_time - initial_time_variance / (2 * time_variance)
return t
# 定位源
t = backward_pass(observed_nodes, initial_time_variance=0.5)
source_node = np.argmax(t)
# 输出定位结果
print('感染源节点:{}'.format(source_node))
# 可视化
pos = nx.spring_layout(G)
node_colors = ['r' if status[node] == 1 else 'b' for node in G.nodes()]
plt.figure(figsize=(8, 8))
nx.draw_networkx_nodes(G, pos, node_color=node_colors)
nx.draw_networkx_edges(G, pos)
nx.draw_networkx_labels(G, pos, font_color='w')
plt.title('SI感染模型和感染源定位结果')
plt.show()
```
运行以上代码后,即可得到输出的节点感染状态和邻居,以及定位结果的可视化图像。需要注意的是,由于数据集较小,所以定位结果可能不太准确,实际应用中可能需要更大的数据集和更复杂的算法来提高定位的准确性。
阅读全文