Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Você pode me dar dicar de como implementar uma análise empírica de redes complexas?

+1 voto
212 visitas
perguntada Set 2, 2015 em Sistemas Complexos por danielcajueiro (5,666 pontos)  
Compartilhe

1 Resposta

+1 voto
respondida Set 2, 2015 por danielcajueiro (5,666 pontos)  

Seguindo a sugestão dessa resposta e usando Python, o código abaixo implementa a estimação de centralidade dos nós usando vários métodos e também a detecção de comunidades usando a noção de modularidade introduzida por Newman, M. E. J. Modularity and community structure in networks. PNAS v. 103, 8577-8582, 2006. Essa noção mede a qualidade da partição em comunidades comparando a densidade de links dentro e fora de cada comunidade (partição).

Para testar esse código, iremos explorar a rede conhecida como o Clube de Karatê de Zachary. Essa rede representa as relações sociais de um clube de karatê que foi acompanhado num período de 3 três anos. Nesse clube houve um conflito entre o professor de Karatê (nó 1) e o presidente do clube (nó 34). A conexão entre indivíduos e´ formada se eles interagiam consistentemente fora do clube. Essa rede foi estudada no artigo W. W. Zachary, An information flow model for conflict and fission in small groups, Journal of Anthropological Research 33, 452-473 (1977).

É fundamental entender que a cada medida de centralidade é mais adequada para um tipo de pergunta empírica diferente e provavelmente a mais interessante aqui é a mais simples que simplesmente conta o número de pessoas que cada um dos membros do clube interagia implicando que justamente o presidente do clube e o professor são realmente os dois caras mais centrais nesse clube. Apresentamos a implementação de várias medidas de centralidade apenas para explorar de forma mais completa o código em Python. Os detalhes de cada uma dessas implementações de centralidade podem ser encontrados no repositório de NetworkX

De fato, na maximização da modularidade apresentada acima, encontramos 4 comunidades. Usamos o método implementado por Blondel, Guillaume, Lambiotte e Lefebvre. Fast unfolding of communities in large networks. Journal of Statistical Mechanics: Theory and Experiment, v. 10, P10008, 2008. Uma análise social dessa partição normalmente supõe-se que existem apenas duas comunidades. A primeira comunidade é formada pelas cores azul e vermelho e a outra comunidade pelas cores verde e amarelo.

A imagem será apresentada aqui.

import community
import matplotlib as plt
import networkx as nx



if __name__ == '__main__':

    #Lendo a rede de Zachary no formato Pajek
    #A base foi baixada de http://networkdata.ics.uci.edu/data/karate/
    G=nx.read_pajek('karate.paj')    
#    nx.draw_networkx(G)

    # Calculo de centralidade

    degree=nx.degree_centrality(G)

    closeness=nx.closeness_centrality(G)

    betwennessNodes=nx.betweenness_centrality(G)

    betwennessEdges=nx.edge_betweenness_centrality(G)    

    eigenvector=nx.eigenvector_centrality_numpy(G)



    Gund = nx.Graph(G)


#first compute the best partition
    partition = community.best_partition(Gund)
#print partition
#drawing
    size = float(len(set(partition.values())))
    pos = nx.spring_layout(Gund)
    count = 0.
    for com in set(partition.values()) :
        if count == 0:
            theColor='r'
        elif count== 1:
            theColor='b'
        elif count == 2:
            theColor='g'
        elif  count== 3:
            theColor='y'


        count = count + 1.
        list_nodes = [nodes for nodes in partition.keys()
                                if partition[nodes] == com]
        nx.draw_networkx_nodes(Gund, pos, list_nodes, node_size = 300,
                               node_color = theColor)

        nx.draw_networkx_edges(Gund,pos, alpha=0.5)
        nx.draw_networkx_labels(Gund,pos)
...