NetworkX中心性分数反归一化问题及版本函数差异咨询
如何对NetworkX的紧密中心性分数进行反归一化处理
我来帮你拆解这个问题,核心是搞清楚NetworkX里归一化的逻辑,再反向推导就行。
首先明确两个版本的归一化规则:
- NetworkX 1.9:当
normalized=True时,会把基于节点所在连通分量的原始紧密中心性,乘以(n-1)/(N-1)(n是连通分量的节点数,N是整个图的总节点数),得到归一化后的分数。 - NetworkX 2.1+:
loseness_centrality的wf_improved=True参数(默认开启),和1.9版本的normalized=True逻辑完全一致,也是用(n-1)/(N-1)来缩放原始分数。
反归一化的核心公式
既然归一化是「原始分数 × (n-1)/(N-1) = 归一化分数」,那反归一化就是把这个过程倒过来:
原始分数 = 归一化分数 × (N-1)/(n-1)
- 这里的
N是整个图的总节点数,n是目标节点所在连通分量的节点数。 - 如果节点所在的连通分量就是整个图(n=N),那反归一化后的分数和归一化分数完全相等,因为
(N-1)/(n-1)=1。
具体实现代码
针对NetworkX 1.9的情况
import networkx as nx # 示例图:包含两个连通分量 G = nx.Graph() G.add_edges_from([(1,2), (2,3), (4,5)]) total_nodes = G.number_of_nodes() # 总节点数:5 # 获取归一化后的紧密中心性 normalized_centrality = nx.closeness_centrality(G, normalized=True) # 反归一化处理 raw_centrality = {} for node in normalized_centrality: # 获取当前节点所在的连通分量 component = nx.node_connected_component(G, node) component_size = len(component) if component_size == 1: # 孤立节点的紧密中心性无意义,可设为0或NaN raw_centrality[node] = 0.0 else: raw_centrality[node] = normalized_centrality[node] * (total_nodes - 1) / (component_size - 1) print("归一化分数:", normalized_centrality) print("反归一化(原始)分数:", raw_centrality)
针对NetworkX 2.1的情况
逻辑和1.9完全一致,只是函数名和参数不同:
import networkx as nx G = nx.Graph() G.add_edges_from([(1,2), (2,3), (4,5)]) total_nodes = G.number_of_nodes() # 获取归一化后的紧密中心性(wf_improved=True是默认值) normalized_centrality = nx.loseness_centrality(G, wf_improved=True) # 反归一化处理 raw_centrality = {} for node in normalized_centrality: component = nx.node_connected_component(G, node) component_size = len(component) if component_size == 1: raw_centrality[node] = 0.0 else: raw_centrality[node] = normalized_centrality[node] * (total_nodes - 1) / (component_size - 1) print("归一化分数:", normalized_centrality) print("反归一化(原始)分数:", raw_centrality)
额外说明
- 如果你在NetworkX 2.1中直接想要未归一化的分数,其实可以直接设置
wf_improved=False,这样函数会直接返回基于连通分量的原始紧密中心性,省去反归一化的步骤。 - 对于孤立节点,因为没有其他节点可以计算距离,所以紧密中心性本身没有实际意义,这里我们统一设为0,你也可以根据需求改为
float('nan')。
内容的提问来源于stack exchange,提问作者Dawei Wang
相关产品推荐
相关产品推荐

