2017-08-21 2 views
1

La question est: Comment calculez-vous la centralisation du vecteur propre pour un graphe en utilisant networkx?Comment créer une fonction networkx pour la centralisation de vecteurs propres pour un réseau entier? (Freeman)

(Comme dans, pas pour les nœuds individuels, mais pour le graphe entier pour la comparaison des nœuds, en utilisant la méthode de Freeman pour ce faire).

J'ai besoin de comparer un certain nombre de graphiques et je souhaite utiliser quatre mesures de centralité différentes pour les comparer:

  • Closeness
  • Betweenness
  • Degré
  • Eigenvector

Networkx n'a actuellement aucune fonction qui calcule la centralisation pour un réseau entier - tous des fonctions renvoie un dictionnaire de la centralité pour chaque noeud.

Notez que la centralisation concerne la distribution de la centralité dans un réseau. J'ai écrit une fonction qui peut calculer la centralité pour l'ensemble du réseau pour les trois premiers, mais je ne peux pas comprendre comment calculer cela pour la centralité Eigenvector.

La théorie est que cela devrait être la somme (centralité max - centralité pour chaque nœud) divisée par le maximum théorique pour un réseau de taille n.

Le plus proche que je peux arriver à trouver comment faire cela pour vecteur propre centralité est de voir la théorie de ce sur la diapositive 32 de this set of lecture notes qui ressemble à ceci:

Ce<-function(Y) 
{ 
    n<-nrow(Y) 
    e<-evecc(Y) 
    Y.sgn<-matrix(0,n,n) ; Y.sgn[1,-1]<-1 ; Y.sgn<-Y.sgn+t(Y.sgn) 
    e.sgn<-evecc(Y.sgn) 
    sum(max(e)-e)/ sum(max(e.sgn)-e.sgn) 
} 

Cela semble être la somme de (centralité propre maximale moins chaque nœud centralité eigné) divisé par quelque chose qui n'a aucun sens - c'est le dénominateur que je ne peux pas comprendre. Mon code en python représente jusqu'ici les trois autres types, mais je n'ai aucune idée de ce que fait ce code (ci-dessus). La partie du code que je ne peux pas comprendre est indiquée. Tous aident beaucoup apprécié.

def getCentrality(centrality, c_type): 

    c_denominator = float(1) 

    n_val = float(len(centrality)) 

    print (str(len(centrality)) + "," + c_type + "\n") 

    if (c_type=="degree"): 
     c_denominator = (n_val-1)*(n_val-2) 

    if (c_type=="close"): 
     c_top = (n_val-1)*(n_val-2) 
     c_bottom = (2*n_val)-3 
     c_denominator = float(c_top/c_bottom) 

    if (c_type=="between"): 
     c_denominator = (n_val*n_val*(n_val-2)) 
    if (c_type=="eigen"): 
     c_denominator = [THIS PART I CAN'T FIGURE OUT] 




    c_node_max = max(centrality.values()) 


    c_sorted = sorted(centrality.values(),reverse=True) 

    print "max node" + str(c_node_max) + "\n" 

    c_numerator = 0 

    for value in c_sorted: 

     if c_type == "degree": 
      #remove normalisation for each value 
      c_numerator += (c_node_max*(n_val-1) - value*(n_val-1)) 
     else: 
      c_numerator += (c_node_max - value) 

    print ('numerator:' + str(c_numerator) + "\n") 
    print ('denominator:' + str(c_denominator) + "\n") 

    network_centrality = float(c_numerator/c_denominator) 

    if c_type == "between": 
     network_centrality = network_centrality * 2 

    return network_centrality 

(notez que la proximité et intermédiarité ne devrait pas être normalisée lors de l'entrée ceux dans cette fonction)

Mise à jour: Suite à la réponse que le code a été complétée et publiée en tant que gist function pour les autres à utiliser

+1

... Y at-il une question ici? –

+0

La question est: "comment puis-je calculer la centralité du vecteur propre du réseau en utilisant networkx"? Il n'y a pas de fonctions intégrées pour y parvenir et je ne trouve aucun code sur le web pour le faire. Le code montre un exemple de la façon de le faire pour d'autres types de centralité, mais je ne peux pas trouver eigenvector. Le dénominateur de la centralité du vecteur propre répertorié dans le code de la question est incorrect. – aldorath

+0

Pouvez-vous expliquer ce que vous entendez par «ensemble de la centralité du vecteur propre du réseau»? Êtes-vous après un seul numéro pour un réseau donné? Je ne peux pas penser à ce que ce serait même. Cette question bénéficierait d'un [mcve] - en particulier, expliquant ce que la sortie attendue est pour un exemple simple. – Joel

Répondre

0

Juste pour être clair, vous cherchez (pense) le vecteur propre centralisation pour un réseau. Centrality est un index au niveau du nœud et est défini uniquement pour les nœuds d'un réseau (ce qui est logique compte tenu de ce qu'ils mesurent). (Si je me souviens bien, Freeman appelle la centralisation "centralité des graphes", mais le terme "centralisation" a remplacé, d'où la confusion possible dans les commentaires.)

Le maximum théorique pour la centralisation de vecteurs propres est le réseau de la même taille avec seulement un bord entre deux nœuds. Dans le cas d'un réseau dirigé, il s'agit de n - 1. Dans le cas d'un réseau non dirigé, il s'agit de sqrt(2)/2 * (n - 2).(Voir Butts, 2016, pg. 56)

Donc, avec cela à l'esprit:

from math import sqrt 
if (c_type=="eigen"): 
    c_denominator = sqrt(2)/2 * (n_val - 2) 

Ou:

if (c_type=="eigen"): 
    c_denominator = n_val - 1 
+0

Merci! C'est une excellente réponse. Tu as raison, la centralisation est ce que j'étais après – Aldorath