You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:37:43