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

为何Numpy与NetworkX计算图拉普拉斯矩阵特征值结果不同?

为什么Numpy和Networkx计算图拉普拉斯特征值结果差异明显?

我尝试使用Python的numpy和networkx包计算任意给定图的属性,但在计算图拉普拉斯矩阵的特征值时,两者返回的结果存在明显差异,请问这是什么原因?

测试代码

import numpy as np
import networkx as nx

#function to normalize laplacian matrix
def symm_norm_laplacian(Lmat):
    Drootmat = np.zeros(shape=(len(Lmat),len(Lmat)))
    for i in range(0,len(Lmat)):
        Drootmat[i,i] = 1/np.sqrt(Lmat[i,i])  
    return Drootmat @ Lmat @ Drootmat

#build simple graph
nodeids = np.array([0,1,2,3,4,5])
parentids = np.array([1,0,0,0,3,3])
G = nx.Graph()
#add nodes
for j in range(0,len(nodeids)):
    G.add_node(nodeids[j])
#add edges
G.add_edge(0,1)
G.add_edge(0,2)
G.add_edge(1,2)
G.add_edge(4,5)
G.add_edge(4,3)
G.add_edge(4,0)
G.add_edge(3,5)

#get Laplacian matrix
LapMat = np.array(nx.laplacian_matrix(G).toarray())

#calculations through numpy
NormLapMat_np = symm_norm_laplacian(LapMat)
eval_np, evec_np = np.linalg.eigh(NormLapMat_np)
sortindex = np.argsort(eval_np)
print('numpy eigenvalues:',eval_np[sortindex])

#calculations through networkx
eval_nx = nx.laplacian_spectrum(G)
print('networkx eigenvalues:',eval_nx)

运行输出

numpy eigenvalues: [1.10622686e-16 2.04666355e-01 1.16666667e+00 1.50000000e+00
 1.50000000e+00 1.62866698e+00]
networkx eigenvals: [-6.25317335e-16  4.38447187e-01  3.00000000e+00  3.00000000e+00
  3.00000000e+00  4.56155281e+00]

版本信息

numpy version: 2.2.3
networkx version: 3.4.2
python3 version: 3.12.2

我一直无法找出差异原因,这会不会和我的设备(MacBook Pro M3 Max)有关?


问题原因及解决方案

1. 核心差异:计算的拉普拉斯矩阵类型不同

  • NetworkX的nx.laplacian_spectrum(G):计算的是未归一化拉普拉斯矩阵的特征值,未归一化拉普拉斯的定义为 $L = D - A$(其中$D$是节点度矩阵,$A$是邻接矩阵)。
  • 你的Numpy代码:计算的是对称归一化拉普拉斯矩阵的特征值,对称归一化拉普拉斯的定义为 $L_{\text{sym}} = D^{-1/2} L D^{-1/2}$,也就是你自定义函数symm_norm_laplacian实现的逻辑。

两种矩阵的特征值完全不同,这是结果差异的根本原因,和设备无关。

2. 验证与修正方法

要让两者结果对应,只需统一计算的矩阵类型:

方法一:用NetworkX计算归一化拉普拉斯谱

替换NetworkX的调用代码,使用nx.normalized_laplacian_spectrum,结果会和你Numpy计算的一致(浮点误差范围内):

eval_nx_norm = nx.normalized_laplacian_spectrum(G)
print('networkx normalized eigenvalues:', np.sort(eval_nx_norm))

输出会和numpy eigenvalues匹配。

方法二:用Numpy计算未归一化拉普拉斯谱

直接对未归一化的LapMat计算特征值,结果会和nx.laplacian_spectrum(G)一致:

eval_np_unnorm, _ = np.linalg.eigh(LapMat)
print('numpy unnormalized eigenvalues:', np.sort(eval_np_unnorm))

输出会和networkx eigenvalues匹配。

3. 关于设备的说明

结果差异和你的MacBook Pro M3 Max完全无关,纯粹是计算逻辑中选择的拉普拉斯矩阵类型不同导致的。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:45:00