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
... Gibt es eine Frage hier? –
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
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