2017-08-21 2 views
1

Die Frage ist: Wie berechnen Sie Eigenvektor Zentralisierung für ein Diagramm mit networkx?Wie erstellen Sie eine Networkx-Funktion für die Eigenvektorzentralisierung für ein ganzes Netzwerk? (Freeman)

(Wie in, nicht für einzelne Knoten, sondern für das gesamte Diagramm zum Vergleichen von Knoten, mit Freeman-Methode dafür).

Ich brauche eine Reihe von verschiedenen Graphen zu vergleichen und ich wünsche ihnen für den Vergleich von vier verschiedenen Zentralität Maßnahmen nutzen:

  • Die Nähe
  • Between
  • Grad
  • Eigenvektor

Derzeit hat networkx keine Funktionen, die die Zentralisierung für ein ganzes Netzwerk berechnen - alle der Funktionen geben ein Wörterbuch der Zentralität für jeden Knoten zurück.

Beachten Sie, dass es bei der Zentralisierung um die Verteilung der Zentralität innerhalb eines Netzwerks geht.

Ich habe eine Funktion geschrieben, die die Zentralität für das gesamte Netzwerk für die ersten drei von diesen berechnen kann, aber ich kann nicht herausfinden, wie dies für die Eigenvektorzentralität zu berechnen ist.

Die Theorie ist, dass es die Summe (maximale Zentralität - Zentralität für jeden Knoten) geteilt durch das theoretische Maximum für ein Netzwerk der Größe n sein sollte.

Die nächstgelegene ich herauszufinden, bekommen kann, wie dies für die Eigenvektor-Zentralität zu tun ist, die Theorie für diese auf Folie zu sehen, 32 von this set of lecture notes, die wie folgt aussieht:

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) 
} 

Dies ist die Summe der zu sein scheint (Max. Eigenzentralität abzüglich jeder Knotenaudizentralität) geteilt durch etwas, das keinen Sinn ergibt - es ist der Nenner, den ich nicht herausfinden kann.

Mein Code in Python ist bisher für die anderen drei Arten, aber ich habe keine Ahnung, was dieser Code tut (oben). Der Teil des Codes, den ich nicht herausfinden kann, ist angegeben. Alle helfen sehr geschätzt.

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 

(beachten Sie, dass Nähe und Between sollte nicht normalisiert werden, wenn diese in dieser Funktion die Eingabe)

Update: Nach der Antwort der Code wurde als gist function für andere fertig gestellt und veröffentlicht verwenden

+1

... Gibt es eine Frage hier? –

+0

Die Frage ist: "Wie berechne ich die gesamte Netzeigenvektorenzentralität mit networkx"? Es gibt keine integrierten Funktionen, um dies zu erreichen, und ich kann keinen Code irgendwo im Web finden, um dies zu tun. Der Code zeigt ein Beispiel, wie man das für andere Arten von Zentralität macht, aber ich kann den Eigenvektor nicht herausfinden. Der Nenner für die Eigenvektorzentralität, der im Code in der Frage aufgeführt ist, ist falsch. – aldorath

+0

Können Sie erklären, was Sie unter der "Gesamtheit der Netzwerkeigenvektorenzentralität" verstehen? Sind Sie hinter einer einzigen Nummer für ein bestimmtes Netzwerk? Ich kann mir nicht vorstellen, was das überhaupt wäre. Diese Frage würde von einem [mcve] profitieren - insbesondere erklären, was die erwartete Ausgabe für ein einfaches Beispiel ist. – Joel

Antwort

0

Nur um klar zu sein, Sie suchen (I denken) der Eigenvektor Zentralisierung für ein Netzwerk. Centrality ist ein Index auf Knotenebene und ist nur für die Knoten eines Netzwerks definiert (was bei der Messung sinnvoll erscheint). (Soweit ich mich erinnere, ruft Freeman Zentralisierung "Grafik Zentralität", aber der Begriff "Zentralisierung" ersetzt hat, daher die mögliche Verwirrung in den Kommentaren.)

Das theoretische Maximum für Eigenvektor Zentralisierung ist das Netzwerk der gleichen Größe mit nur eine Kante zwischen zwei Knoten. Bei einem gerichteten Netzwerk ist dies n - 1. Im Falle eines ungerichteten Netzwerks ist es sqrt(2)/2 * (n - 2).(Siehe Butts, 2016, pg. 56)

Also mit diesem Gedanken:

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

Oder:

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

Danke! Dies ist eine ausgezeichnete Antwort. Du hast recht, Zentralisierung ist das, wonach ich gesucht habe – Aldorath

Verwandte Themen