春秋白LU 2023-04-10 10:29 采纳率: 20%
浏览 43
已结题

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

怎么导入一个真实的社交网络到我的这个sir模型里面呀,不知道怎么寻找资源和导入方法。求帮助。

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:
                r_nodes.add_node(i)
                i_nodes.remove(i)
                G.nodes[i]['state'] = 'R'
        i_nodes_temp = nx.Graph()
        i_nodes_temp.add_nodes_from(i_nodes)

        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个点作为感染源
result = spread(er,0.3,5,centrality,0.1)
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库进行处理和分析。

    以下是一个示例代码,以导入Facebook网络为例:

    1.下载数据集

    在以下网址下载Facebook数据集:https://snap.stanford.edu/data/ego-Facebook.html

    2.转换数据格式

    Facebook数据集是文本格式,需要将其转换为适合networkx库处理的图形格式。

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

    edge_list = []
    with open('facebook_combined.txt') as f:
        for line in f:
            edge = tuple(map(int, line.strip().split()))
            edge_list.append(edge)
    

    其中,'facebook_combined.txt'为下载下来的文件名称。

    3.生成图形对象

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

    import networkx as nx
    
    G = nx.Graph()
    G.add_edges_from(edge_list)
    

    这样就生成了一个包含了Facebook网络所有节点和边的图形对象。

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

    在原来的代码中,需要将生成的网络对象er替换为Facebook网络图形对象G,即:

    #er = nx.random_graphs.watts_strogatz_graph(N,k,p)
    G = nx.Graph()
    G.add_edges_from(edge_list)
    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
    
    # 下载Facebook数据集后,将数据转换为边列表
    edge_list = []
    with open('facebook_combined.txt') as f:
        for line in f:
            edge = tuple(map(int, line.strip().split()))
            edge_list.append(edge)
    
    # 生成图形对象
    G = nx.Graph()
    G.add_edges_from(edge_list)
    
    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:
                    r_nodes.add_node(i)
                    i_nodes.remove(i)
                    G.nodes[i]['state'] = 'R'
            i_nodes_temp = nx.Graph()
            i_nodes_temp.add_nodes_from(i_nodes)
    
            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个点作为感染源
    result = spread(G,0.3,5,centrality,0.1)
    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条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上