我正在尝试为非常大的图中的几个节点计算居中性。我一直在使用NetworkX。问题在于它不会让我选择我需要集中的节点。我尝试修改源代码,但这给了我错误。这是我所做的:
betweenness = dict.fromkeys(G, 0.0) # b[v]=0 for v in G
if k is None:
nodes = G
#nodes = nx.Graph()
#for indx in range(0, G.size()):
#if indx in subset:
#nodes.add_node(allNodes[indx])
else:
random.seed(seed)
nodes = random.sample(G.nodes(), k)
for s in nodes:
n = nodes.nodes().index(s)
if n in subset:
# single source shortest paths
if weight is None: # use BFS
S, P, sigma = _single_source_shortest_path_basic(G, s)
else: # use Dijkstra's algorithm
S, P, sigma = _single_source_dijkstra_path_basic(G, s, weight)
# accumulation
if endpoints:
betweenness = _accumulate_endpoints(betweenness, S, P, sigma, s)
else:
betweenness = _accumulate_basic(betweenness, S, P, sigma, s)
# rescaling
betweenness = _rescale(betweenness, len(interCommNodes),
normalized=normalized,
directed=G.is_directed(),
k=k)
return betweenness
子集包含原始图中的所有节点索引。虽然“索引”似乎是无效的函数,但我找不到找到它的方法。
有人可以看看吗?
谢谢!
答案 0 :(得分:0)
恐怕这不会直接解决您的答案。
大概您要进行此计算的原因是为了加快处理速度,因为中间性中心是一个缓慢的计算(Networkx never finishes calculating Betweenness centrality for 2 mil nodes)。
让它变慢的部分是它必须找到每对节点之间的最短路径,然后查看要通过其中心位置的每个节点要经过的分数。因此,即使您只是想了解几个节点,您仍然必须找到所有最短的路径,这是迄今为止计算中最昂贵的部分。因此,提供选项来完成所有工作,然后仅报告几个节点的中心性并没有多大意义。
如果确实需要加快计算速度,则可以采用一种近似方法。与其采取每一对节点并找到它们之间的最短路径,不如对所有节点进行抽样并查看它们之间的最短路径。有关详细信息,请参见以下答案:https://stackoverflow.com/a/32468942/2966723