# 怎么在Pycharm导入真实社交网络(语言-python)

``````import networkx as nx
import matplotlib.pyplot as plt
import random
import numpy as np

#来生成一个有N个节点，连接概率为p,邻居为k的随机网络
N = 20
p = 0.25
k = 4
#er=nx.erdos_renyi_graph(N,p)
er = nx.random_graphs.watts_strogatz_graph(N,k,p)
for i in range(N):
er.nodes[i]['state'] = 'S'
edge_color = 'g'
gama = 0.5
beta = 0.1

ps= nx.spring_layout(er)  #nx.spectral_layout(er)nx.circular_layout(er)nx.shell_layout(er)nx.spring_layout(er)#布置框架
colors = {"R": 'b', "I": 'r', "S": 'g'}

states= nx.get_node_attributes(er, 'state')  # 获得节点的isCore属性
color=[colors[states[i]] for i in range(N)]

#nx.draw(er,ps,node_color =color ,with_labels=True,node_size=50)
nx.draw_networkx_nodes(er,ps,node_color =color ,node_size=50)
nx.draw_networkx_edges(er,ps ,width=1,arrows=True,arrowstyle='->')

plt.show()

def centrality(G):
#计算度中心性,降序
dc = nx.algorithms.centrality.degree_centrality(G)
return    sorted(dc.items(), key=lambda x: x[1],reverse = True)
def betweenness(G):
#计算介数中心性,降序
dc = nx.betweenness_centrality(G)
return sorted(dc.items(), key=lambda x: x[1],reverse = True)
def closeness(G):
#计算接近中心性,降序
dc = nx.closeness_centrality(G)
return sorted(dc.items(), key=lambda x: x[1],reverse = True)

def spread(G, beta, initial, func, gamma=0):
colors = {"R": 'b', "I": 'r', "S": 'g'}

y = []
n = len(G.nodes)  # 总人数
for i in range(n):  # 所有人默认为易感染
G.nodes[i]['state'] = 'S'
edge_color = 'g'
arrow_color = 'g'
s = n - initial  # 易感染人数
desc_dc = func(G)

i_nodes = []
# 选择前inttial个度中心性最高的节点设为感染源
for i in range(initial):
G.nodes[desc_dc[0][0]]['state'] = 'I'
i_nodes.append(desc_dc[0][0])
desc_dc.remove(desc_dc[0])
y.append(((s, (len(i_nodes)), 0)))
# 开始传播，直到所有人被传染

r_nodes = nx.Graph()
while len(i_nodes) != 0:
print(s)
# 当前轮被传染的人数
i_temp = []
# 当前恢复人数 gamma 概率
for i in i_nodes:
if random.random() < gamma:
i_nodes.remove(i)
G.nodes[i]['state'] = 'R'
i_nodes_temp = nx.Graph()

for i in i_nodes_temp.nodes:

# 按beta概率传染I节点的邻居节点
for node in G.neighbors(i):
r = random.random()
edge_color = 'r'
if r < beta and G.nodes[node]['state'] == 'S':
G.nodes[node]['state'] = 'I'
edge_color = 'r'
arrow_color = 'r'
i_temp.append(node)
for t in i_temp:
if t not in i_nodes:
i_nodes.append(t)
s = n - len(i_nodes) - len(r_nodes.nodes)

i = len(i_nodes)
r = len(r_nodes.nodes)
y.append((s, i, r))
states = nx.get_node_attributes(G, 'state')  ############ 获得节点的属性
color = [colors[states[i]] for i in range(n)]
nx.draw(G, ps, node_color=color, with_labels=True, node_size=50)
nx.draw_networkx_edges(er, ps,  width=1, arrows=True, arrowstyle='->')
plt.show()
return np.array(y)
#选择度中心性最高的5个点作为感染源
print(result)
plt.plot(result[:,0], 'g', label='Susceptibles')
plt.plot(result[:,1], 'r', label='Infectious')
plt.plot(result[:,2], 'b', label='Recovereds')
plt.legend(loc='right')
plt.xlabel('time')
plt.ylabel('number of people')

``````
• 写回答

#### 5条回答默认 最新

• 极客智能体-在线 2023-04-10 19:46
关注

以下答案由GPT-3.5大模型与博主波罗歌共同编写：
要导入一个真实的社交网络到sir模型中，可以通过网络数据集或者API调用的方式获取网络数据，然后将数据转换为图形格式存储，最后可以使用networkx库进行处理和分析。

1.下载数据集

2.转换数据格式

可以使用以下代码将数据转换为边列表格式：

``````edge_list = []
for line in f:
edge = tuple(map(int, line.strip().split()))
edge_list.append(edge)
``````

3.生成图形对象

可以使用以下代码将边列表转换为networkx图形对象：

``````import networkx as nx

G = nx.Graph()
``````

4.将图形对象传入sir模型中

``````#er = nx.random_graphs.watts_strogatz_graph(N,k,p)
G = nx.Graph()
for i in range(N):
G.nodes[i]['state'] = 'S'
edge_color = 'g'
``````

然后就可以使用原来的代码进行模拟。

完整代码如下：

``````import networkx as nx
import matplotlib.pyplot as plt
import random
import numpy as np

edge_list = []
for line in f:
edge = tuple(map(int, line.strip().split()))
edge_list.append(edge)

# 生成图形对象
G = nx.Graph()

N = len(G.nodes)
p = 0.25
k = 4

for i in range(N):
G.nodes[i]['state'] = 'S'
edge_color = 'g'

gama = 0.5
beta = 0.1

# 布局
ps= nx.spring_layout(G)

colors = {"R": 'b', "I": 'r', "S": 'g'}

states= nx.get_node_attributes(G, 'state')
color=[colors[states[i]] for i in range(N)]

nx.draw_networkx_nodes(G,ps,node_color=color,node_size=50)
nx.draw_networkx_edges(G,ps,width=1,arrows=True,arrowstyle='->')
plt.show()

def centrality(G):
#计算度中心性,降序
dc = nx.algorithms.centrality.degree_centrality(G)
return    sorted(dc.items(), key=lambda x: x[1],reverse = True)

def betweenness(G):
#计算介数中心性,降序
dc = nx.betweenness_centrality(G)
return sorted(dc.items(), key=lambda x: x[1],reverse = True)

def closeness(G):
#计算接近中心性,降序
dc = nx.closeness_centrality(G)
return sorted(dc.items(), key=lambda x: x[1],reverse = True)

def spread(G, beta, initial, func, gamma=0):
colors = {"R": 'b', "I": 'r', "S": 'g'}

y = []
n = len(G.nodes)  # 总数
for i in range(n):
G.nodes[i]['state'] = 'S'
edge_color = 'g'
s = n - initial
desc_dc = func(G)

i_nodes = []
# 选择前inttial个度中心性最高的节点设为感染源
for i in range(initial):
G.nodes[desc_dc[i][0]]['state'] = 'I'
i_nodes.append(desc_dc[i][0])

y.append(((s, (len(i_nodes)), 0)))
# 开始传播，直到所有人被传染

r_nodes = nx.Graph()
while len(i_nodes) != 0:
# 当前轮被传染的人数
i_temp = []
# 当前恢复人数 gamma 概率
for i in i_nodes:
if random.random() < gamma:
i_nodes.remove(i)
G.nodes[i]['state'] = 'R'
i_nodes_temp = nx.Graph()

for i in i_nodes_temp.nodes:

# 按beta概率传染I节点的邻居节点
for node in G.neighbors(i):
r = random.random()
if r < beta and G.nodes[node]['state'] == 'S':
G.nodes[node]['state'] = 'I'
i_temp.append(node)

for t in i_temp:
if t not in i_nodes:
i_nodes.append(t)
s = n - len(i_nodes) - len(r_nodes.nodes)

i = len(i_nodes)
r = len(r_nodes.nodes)
y.append((s, i, r))
states = nx.get_node_attributes(G, 'state')
color = [colors[states[i]] for i in range(n)]
nx.draw_networkx_nodes(G,ps,node_color=color,node_size=50)
nx.draw_networkx_edges(G,ps,width=1,arrows=True,arrowstyle='->')
plt.show()

return np.array(y)

# 选择度中心性最高的5个点作为感染源
print(result)

plt.plot(result[:,0], 'g', label='Susceptibles')
plt.plot(result[:,1], 'r', label='Infectious')
plt.plot(result[:,2], 'b', label='Recovereds')
plt.legend(loc='right')
plt.xlabel('time')
plt.ylabel('number of people')
plt.show()
``````

注意，在处理大型真实社交网络时，可能需要使用分布式计算框架，在集群上进行计算，避免计算时间过长导致的长时间等待。
如果我的回答解决了您的问题，请采纳！

本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论
1人已打赏

• 系统已结题 4月20日
• 已采纳回答 4月12日
• 创建了问题 4月10日

#### 悬赏问题

• ¥15 WPF如何用Chart绘画出Y轴的左边数据
• ¥15 pycharm无法查看内置代码
• ¥15 跑hls xfopencv的例程standalone_hls_axi_example出的错误，csim没问题，c synthesis出的错误
• ¥15 sqlserver update语句逐行生效
• ¥15 mssql2000游标循环次数对不上
• ¥20 Windows10系统命令行调用
• ¥15 php环境如何实现国密SM2相关功能
• ¥15 关于#单片机#的问题：K210 例程里面提示我iomem.h: No such file or directory
• ¥15 LSPI算法的大问题
• ¥15 java导出word 动态填充数据