3

私は非常に平凡なプログラマーですが、igraph python ライブラリを使用して、特定のフォーラムでのユーザーの中心性の影響を判断し、そのフォーラムへのその後の貢献を予測することを目指しています。

私は、 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!'

igraph ドキュメントで個々の頂点 (または NetworkX 専門用語ではノード) を呼び出す方法が見つからないため、エラー メッセージが表示されます)。おそらく私は何か他のことも忘れています。私はおそらく気の利かないプログラマーです :P

私は何を間違っていますか?

4

2 に答える 2

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!'
于 2011-12-15T21:01:27.560 に答える
1

すでに気づいたように、igraph の個々の頂点はvs、グラフ オブジェクトの属性を使用してアクセスされます。vsリストのように振る舞うので、それを反復するとグラフの頂点が得られます。各頂点はVertexクラスのインスタンスによって表され、頂点のインデックスはそのindex属性によって与えられます。( igraph は頂点とエッジの両方に連続した数値インデックスを使用することに注意してください。そのため、index属性が必要であり、元の頂点名を直接使用することはできません)。

必要なのは、入力ファイルに最初に保存された頂点の名前だと思います。name名前は (入力形式に応じて) or vertex 属性に格納される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))
于 2011-11-19T20:21:40.113 に答える