Определение центральности между библиотекой Igraph - PullRequest
3 голосов
/ 20 ноября 2011

Я очень, очень посредственный программист, но я все еще стремлюсь использовать библиотеку Python igraph , чтобы определить влияние центральности пользователя на данном форуме, чтобы предсказать его последующий вклад в этот форум.

Я связался с кем-то, кто использовал библиотеку NetworkX для чего-то похожего, но, учитывая текущий размер форума, вычислить точные индексы центральности практически невозможно - это просто слишкоммного времени.

Это был его код:

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 (которая позволяет делать быстрые оценки, а не точные вычисления), но я не могукажется, что данные записываются в файл CSV.

Мой код:

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!'

Я не могу найти способ вызова отдельных вершин (или узлов, в жаргоне NetworkX) в документации igraph,так вот где я получаю сообщения об ошибках).Возможно, я забыл еще кое-что;Я, наверное, слишком плохой программист, чтобы замечать: P

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Итак, для ясности, в конечном итоге оказалось следующее:

import igraph
import sys, csv

from igraph import *
from itertools import izip

graph = Graph.Read_GML("C:\stack.gml")

print igraph.summary(graph)

my_id_to_igraph_id = dict((v, k) for k, v in enumerate(graph.vs["id"]))

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

print graph.vertex_attributes()

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

outcsv.writerows(izip(graph.vs["id"], estimate))

print 'Complete!'
1 голос
/ 20 ноября 2011

Как вы уже заметили, доступ к отдельным вершинам в igraph осуществляется с помощью атрибута vs вашего графического объекта.vs ведет себя как список, поэтому итерирование по нему даст вершины графа.Каждая вершина представлена ​​экземпляром класса Vertex, а index вершины задается ее атрибутом index.(Обратите внимание, что igraph использует непрерывные числовые индексы как для вершин, так и для ребер, поэтому вам нужен атрибут index и вы не можете напрямую использовать ваши исходные имена вершин).

Я предполагаю, что вам нужно это имя вершины, которая изначально была сохранена во входном файле.Имена хранятся в атрибуте вершины name или id (в зависимости от вашего входного формата), поэтому вам, вероятно, потребуется следующее:

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

Обратите внимание, что доступ к атрибутам вершины осуществляется путем индексации объекта вершины.как будто это был словарь.Альтернативой является использование объекта vs непосредственно в качестве словаря;это даст вам список, содержащий значения данного атрибута вершины для всех вершин.Например:

from itertools import izip

for name, est in izip(graph.vs["name"], estimate):
    outcsv.writerow([name, est])

Еще более быстрая версия с использованием выражений генератора:

outcsv.writerows(izip(graph.vs["name"], estimate))
...