运用si感染模型感染导入的'football.edge'数据集,输出打印节点感染状态和邻居,之后设置观测节点,利用反向传播算法来定位,输出结果并将定位结果可视化
时间: 2023-10-02 14:07:35 浏览: 111
首先,我们需要导入所需的库和数据集:
```python
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
# 导入数据集
G = nx.read_edgelist('football.edge')
```
接下来,我们使用SI模型来模拟疾病在网络中的传播过程。我们将所有节点的初始状态设为0(未感染),并将其中一个节点设置为1(已感染)。
```python
# 初始感染节点
infected_node = '1'
# 设置所有节点的初始状态为0
for node in G.nodes():
G.nodes[node]['status'] = 0
# 将初始感染节点的状态设置为1
G.nodes[infected_node]['status'] = 1
```
接下来,我们定义SI模型的传播规则。在每个时间步骤中,每个未感染的节点都有一定的概率被其邻居节点感染。我们可以通过设置一个传播概率来控制疾病的传播速度。
```python
# 定义传播概率
p = 0.5
# 定义SI感染模型的传播规则
def si_model(G, p):
# 遍历所有节点
for node in G.nodes():
# 如果当前节点未感染
if G.nodes[node]['status'] == 0:
# 遍历当前节点的邻居节点
for neighbor in G.neighbors(node):
# 如果邻居节点已感染
if G.nodes[neighbor]['status'] == 1:
# 根据传播概率p来决定当前节点是否被感染
if np.random.random() < p:
G.nodes[node]['status'] = 1
break
```
现在,我们可以运行SI模型来模拟疾病在网络中的传播过程。我们将模拟100个时间步骤,并在每个时间步骤中打印出当前节点的感染状态和邻居节点。
```python
# 运行SI模型模拟疾病传播过程
for i in range(100):
si_model(G, p)
print("Time step:", i+1)
for node in G.nodes():
print("Node:", node, "Status:", G.nodes[node]['status'], "Neighbors:", list(G.neighbors(node)))
```
接下来,我们将设置观测节点并利用反向传播算法来定位感染源节点。我们将使用PyTorch来实现反向传播算法。
```python
import torch
import torch.nn as nn
import torch.optim as optim
# 将节点编号转换为PyTorch张量
node_list = list(G.nodes())
node_list.sort()
node_tensor = torch.tensor([int(node) for node in node_list])
# 将邻接矩阵转换为PyTorch张量
adj_matrix = nx.to_numpy_matrix(G, nodelist=node_list)
adj_tensor = torch.tensor(adj_matrix)
# 定义观测节点
observed_node = '15'
# 定义感染源定位模型
class InfectionLocater(nn.Module):
def __init__(self, adj_tensor):
super(InfectionLocater, self).__init__()
self.adj_tensor = adj_tensor
self.weight = nn.Parameter(torch.randn(len(adj_tensor)))
def forward(self, node_tensor):
# 计算邻接矩阵的加权和
adj_weighted_sum = torch.matmul(self.adj_tensor, self.weight)
# 获取观测节点的下标
observed_node_index = (node_tensor == int(observed_node)).nonzero().item()
# 返回观测节点的感染概率
return torch.sigmoid(adj_weighted_sum[observed_node_index])
# 创建感染源定位模型
model = InfectionLocater(adj_tensor)
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
```
现在,我们可以训练感染源定位模型,以便能够准确地定位感染源节点。
```python
# 训练感染源定位模型
for epoch in range(1000):
# 将所有节点的状态设置为0(未感染)
for node in G.nodes():
G.nodes[node]['status'] = 0
# 将观测节点的状态设置为1(已感染)
G.nodes[observed_node]['status'] = 1
# 运行SI模型模拟疾病传播过程
for i in range(100):
si_model(G, p)
# 将感染源定位模型的梯度清零
optimizer.zero_grad()
# 计算观测节点的感染概率
output = model(node_tensor)
# 计算损失函数
loss = criterion(output, torch.tensor([1.0]))
# 反向传播
loss.backward()
# 更新模型参数
optimizer.step()
# 打印训练过程中的损失值和观测节点的感染概率
if epoch % 100 == 0:
print("Epoch:", epoch, "Loss:", loss.item(), "Output:", output.item())
```
最后,我们可以将定位结果可视化,以便更直观地观察感染源节点的定位效果。
```python
# 可视化定位结果
pos = nx.spring_layout(G)
node_colors = []
for node in G.nodes():
if G.nodes[node]['status'] == 1:
node_colors.append('red')
else:
node_colors.append('blue')
plt.figure(figsize=(10, 10))
nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=200)
nx.draw_networkx_edges(G, pos, width=1.0, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_family="sans-serif")
plt.show()
```
阅读全文