我是一个非常非常平庸的程序员,但我仍然希望使用igraph python库来确定用户在给定论坛中的中心性,以预测他后来对该论坛的贡献。
我与使用NetworkX库做其他类似事情的其他人取得了联系,但考虑到论坛目前的规模,计算精确的中心性指数实际上是不可能的 - 只需花费太多时间。 / p>
这是他的代码:
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!'
我无法在igraph文档中找到如何调用单个顶点(或NetworkX术语中的节点),这样我就会收到错误消息。也许我也忘了别的东西;程序员注意到我可能太糟糕了:P
我做错了什么?
答案 0 :(得分:2)
因此,为了清楚起见,以下最终证明了这一点:
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 :(得分:1)
正如您已经注意到的那样,使用图形对象的vs
属性访问igraph中的各个顶点。 vs
的行为类似于列表,因此迭代它将产生图的顶点。每个顶点由Vertex
类的实例表示,顶点的索引由其index
属性给出。 (请注意,igraph使用顶点和边缘的连续数字索引,因此您需要index
属性并且不能直接使用原始顶点名称。)
我认为你需要的是最初存储在输入文件中的顶点的名称。名称存储在name
或id
顶点属性中(取决于您的输入格式),因此您需要的可能是:
for v in graph.vs:
outcsv.writerow([v["name"], estimate[v.index]])
请注意,通过索引顶点对象来访问顶点属性,就好像它是一个字典一样。另一种方法是将vs
对象直接用作字典;这将为您提供一个列表,其中包含所有顶点的给定顶点属性的值。 E.g:
from itertools import izip
for name, est in izip(graph.vs["name"], estimate):
outcsv.writerow([name, est])
使用生成器表达式的更快版本:
outcsv.writerows(izip(graph.vs["name"], estimate))