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

NetworkX加权网络Katz中心性计算异常求助及示例需求

Katz中心性计算出现负值的问题排查与修正

问题现象

使用NetworkX计算加权网络的Katz中心性时,输出结果出现负值,且结果顺序与预期相反(预期高连接度节点的中心性值应高于低连接节点)。

原始实现代码

# Katz中心性计算
G = nx.from_numpy_matrix(network_matrix)
katz_centrality = nx.katz_centrality_numpy(G, weight='weight')

for x in range(16):
    print(katz_centrality[x])

输出结果

-0.0884332150881479
-0.32425466748018883
-0.3110317711173531
-0.3242546674801888
-0.04185470336734943
0.09838584696311473
0.09838584696311474
0.059865838163826485
0.16708256470211458
0.3491707134096127
0.3033563463599785
0.1478838644009215
0.329818599950434
0.3771672006736501
0.35188750514365186
0.1478838644009215

参考邻接矩阵

[[0. 5. 5. 5. 9. 3. 3. 3. 2. 3. 0. 0. 2. 0. 0. 0.]
 [5. 0. 7. 9. 4. 2. 2. 2. 1. 0. 1. 0. 0. 0. 0. 0.]
 [5. 7. 0. 7. 4. 1. 1. 1. 0. 0. 1. 0. 0. 0. 0. 0.]
 [5. 9. 7. 0. 4. 2. 2. 2. 1. 0. 1. 0. 0. 0. 0. 0.]
 [9. 4. 4. 4. 0. 2. 2. 2. 1. 4. 0. 0. 2. 0. 0. 0.]
 [3. 2. 1. 2. 2. 0. 5. 2. 3. 1. 0. 0. 0. 0. 0. 0.]
 [3. 2. 1. 2. 2. 5. 0. 2. 3. 1. 0. 0. 0. 0. 0. 0.]
 [3. 2. 1. 2. 2. 2. 2. 0. 2. 1. 0. 0. 0. 0. 0. 0.]
 [2. 1. 0. 1. 1. 3. 3. 2. 0. 1. 0. 0. 0. 0. 0. 0.]
 [3. 0. 0. 0. 4. 1. 1. 1. 1. 0. 1. 0. 3. 1. 1. 0.]
 [0. 1. 1. 1. 0. 0. 0. 0. 0. 1. 0. 0. 1. 3. 2. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [2. 0. 0. 0. 2. 0. 0. 0. 0. 3. 1. 0. 0. 1. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 3. 0. 1. 0. 2. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 2. 0. 1. 2. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

问题原因

  1. nx.katz_centrality_numpy实现特性:该函数默认使用邻接矩阵的转置计算,未显式设置alpha时会自动选取接近最大特征值倒数的数值。当加权邻接矩阵的最大特征值为负数时,直接导致中心性结果出现负值。
  2. 孤立节点干扰:网络中的孤立节点(节点11、15)会干扰特征值计算,加剧结果异常。

修正后的实现代码

import networkx as nx
import numpy as np

# 定义加权邻接矩阵
network_matrix = np.array([
    [0.,5.,5.,5.,9.,3.,3.,3.,2.,3.,0.,0.,2.,0.,0.,0.],
    [5.,0.,7.,9.,4.,2.,2.,2.,1.,0.,1.,0.,0.,0.,0.,0.],
    [5.,7.,0.,7.,4.,1.,1.,1.,0.,0.,1.,0.,0.,0.,0.,0.],
    [5.,9.,7.,0.,4.,2.,2.,2.,1.,0.,1.,0.,0.,0.,0.,0.],
    [9.,4.,4.,4.,0.,2.,2.,2.,1.,4.,0.,0.,2.,0.,0.,0.],
    [3.,2.,1.,2.,2.,0.,5.,2.,3.,1.,0.,0.,0.,0.,0.,0.],
    [3.,2.,1.,2.,2.,5.,0.,2.,3.,1.,0.,0.,0.,0.,0.,0.],
    [3.,2.,1.,2.,2.,2.,2.,0.,2.,1.,0.,0.,0.,0.,0.,0.],
    [2.,1.,0.,1.,1.,3.,3.,2.,0.,1.,0.,0.,0.,0.,0.,0.],
    [3.,0.,0.,0.,4.,1.,1.,1.,1.,0.,1.,0.,3.,1.,1.,0.],
    [0.,1.,1.,1.,0.,0.,0.,0.,0.,1.,0.,0.,1.,3.,2.,0.],
    [0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.],
    [2.,0.,0.,0.,2.,0.,0.,0.,0.,3.,1.,0.,0.,1.,1.,0.],
    [0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,3.,0.,1.,0.,2.,0.],
    [0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,2.,0.,1.,2.,0.,0.],
    [0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.]
])

# 构建图结构
G = nx.from_numpy_matrix(network_matrix)

# 计算加权邻接矩阵的最大特征值,确定alpha的安全取值
adj_matrix = nx.to_numpy_array(G, weight='weight')
max_eigenvalue = np.max(np.linalg.eigvals(adj_matrix))
alpha = 1 / max_eigenvalue * 0.9  # 取最大特征值倒数的0.9倍,确保收敛稳定性

# 使用通用版Katz中心性计算,指定权重参数
katz_centrality = nx.katz_centrality(G, alpha=alpha, weight='weight')

# 按节点顺序输出结果
for node in sorted(katz_centrality.keys()):
    print(katz_centrality[node])

关键说明

  • 显式计算最大特征值并设置alpha:确保alpha小于最大特征值的倒数,保证计算收敛且结果为正。
  • 选用nx.katz_centrality替代numpy版本:该函数在处理加权网络时更稳定,默认适配正权重场景。
  • 孤立节点的中心性会趋近于极小正值,符合网络分析预期。

内容的提问来源于stack exchange,提问作者jcpark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:24:32