为何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
相关产品推荐
相关产品推荐

