[Python] Betweenness centrality bepalen via igraph

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • daniel_ev
  • Registratie: Maart 2004
  • Laatst online: 13-09 18:19
Ik ben een zeer, zeer beperkt programmeur, maar probeer toch voor mijn afstuderen middels de igraph library voor python de betweenness centrality van de verschillende gebruikers van een internetforum te bepalen.

Een auteur van een vergelijkbaar onderzoek gebruikte hier de NetworkX library voor, maar het exact bepalen van centrality indices is tegenwoordig, gezien de grootte van het forum, volstrekt onmogelijk: de precieze berekening is dermate ingewikkeld dat een behoorlijke computer hier nog steeds weken mee bezig is...


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import networkx as netx
import sys, csv

if len(sys.argv) is not 2:
   print 'Please specify an input graph.'
   sys.exit(1)

ingraph = sys.argv[1]
graph = netx.readwrite.gpickle.read_gpickle(ingraph)

num_nodes = len(graph.nodes())
print '%s nodes found in input graph.' % num_nodes
print 'Recording data in centrality.csv'

# Calculate all of the betweenness measures
betweenness = netx.algorithms.centrality.betweenness_centrality(graph)
print 'Betweenness computations complete.'
closeness = netx.algorithms.centrality.closeness_centrality(graph)
print 'Closeness computations complete.'

outcsv = csv.writer(open('centrality.csv', 'wb'))

for node in graph.nodes():
   outcsv.writerow([node, betweenness[node], closeness[node]])

print 'Complete!'


Igraph biedt, in tegenstelling tot de NetworkX library, de mogelijkheid om het aantal paden dat meegenomen wordt om iemands centrality index te bepalen, te beperken. Een dergelijke benadering kost significant minder tijd en is voor het huidig onderzoek meer dan voldoende.
Ik heb op basis van het bovenstaande mijn eigen (test)scriptje geschreven, maar dat levert nog enkel foutmeldingen op: ik loop in de knel bij het wegschrijven van de verkregen data naar een CSV bestand, en snap ook niet precies hoe verschillende vertices binnen het netwerk op te roepen.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import igraph
import sys, csv

from igraph import *

graph = Graph.Read_Pajek("C:\karate.net")
        
print igraph.summary(graph)

estimate = graph.betweenness(vertices=None, directed=True, cutoff=2)
print 'Betweenness computation complete.'

outcsv = csv.writer(open('estimate.csv', 'wb'))

for v in graph.vs():
   outcsv.writerow([v, estimate[vs]])

print 'Complete!'


De NetworkX library spreekt van 'nodes'; de igraph library van 'vertices'. Maar het wegschrijven van de lijst van centrality indices per vertex naar een CSV bestand lukt dus nog niet. Wat doe ik fout?

Toch?


Acties:
  • 0 Henk 'm!

Verwijderd

Deze post is waarschijnlijk niet helemaal een oplossing maar eerder een work-around aangezien ik zelf geen python kan. Ik kreeg alleen het vermoeden dat je aanpak voor het probleem misschien niet de juiste is.

Ik ken de context niet maar ik zie dat je een input wil omrekenen en dit gelijk weer in een output bestand duwt en python vooral bedoeld is om de bereken stap uit te voeren. Kan je deze data niet laden in een alternatief programma als UCINET6 of ORA die ook bedoeld zijn om netwerkdata te analyseren? Volgens mij kan UCINET deze berekening goed uitvoeren. ORA is meer visueel. Dit lijkt mij logischer dan python als tussenstap te gebruiken.

[ Voor 18% gewijzigd door Verwijderd op 20-11-2011 17:28 ]


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

daniel_ev schreef op zaterdag 19 november 2011 @ 18:14:
Ik heb op basis van het bovenstaande mijn eigen (test)scriptje geschreven, maar dat levert nog enkel foutmeldingen op: ik loop in de knel bij het wegschrijven van de verkregen data naar een CSV bestand, en snap ook niet precies hoe verschillende vertices binnen het netwerk op te roepen.
Op basis van je post valt hier bijzonder weinig over te zeggen. Je hebt niet aangegeven wat voor foutmeldingen je krijgt, en het grootste deel van je code maakt helemaal geen deel uit van dit scriptje.

Rustacean


Acties:
  • 0 Henk 'm!

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 19:29
Je schrijft hier:
code:
1
2
for v in graph.vs():
   outcsv.writerow([v, estimate[vs]])

Maar moet estimate[vs] niet estimate[v] zijn?

Daarnaast heb je zelf al gekeken naar wat de waarden zelf zijn? (bijv. door ze te dumpen in een tekst-bestand, zie ook de Debugging FAQ)