python vs R 中特征向量的不良矩阵重建

Poor matrix reconstruction from eigenvectors in python vs R

我正在努力学习 python,但我 运行 遇到了一些让我感到困惑的事情。就像健全性检查一样,我想确保我可以从其特征向量和特征值重建图拉普拉斯矩阵。在 R 中,这按预期工作,但在 python 中不是。 python 重建矩阵非常偏离 - 范数(拉普拉斯算子 - 估计)~ 0.99,而在 R 中它是~1e-16。我希望有人能向我解释这里发生了什么。我在下面发布了两种语言的代码:

在 R 中:

library(igraph)
g <- watts.strogatz.game(1, 20, 3, 0, loops = FALSE, multiple = FALSE)
A <- as.matrix(as_adjacency_matrix(g, type = c("both"),
                                   attr = NULL, edges = FALSE, names = TRUE,
                                   sparse = FALSE))
A <- -A
diag(A) <- abs(rowSums(A))
D <- diag(diag(A)^-0.5, dmn[1])
Ln <- D %*% A %*% D
eL <- eigen(Ln)
rL <- eL$vectors %*% diag(eL$values) %*% t(eL$vectors)
print(norm(Ln - rL))

在Python中:

import networkx as nx
import numpy as np

n=20
G = nx.watts_strogatz_graph(n, 3, 0) 
L = nx.normalized_laplacian_matrix(G).toarray()
evals, evecs = np.linalg.eig(L)
idx = evals.argsort()[::-1]   
evals = evals[idx]
F = evecs[:,idx]
D = np.diag(evals)
FDF = np.linalg.multi_dot([F, D, F.T])
rec = np.linalg.norm(L - FDF)
print(rec)

谢谢!

保罗

这并没有真正回答问题,但使用 np.linalg.svd 而不是 np.linalg.eig 似乎工作正常。

edit其实,现在我明白了。 numpylinalg.eig,它 而不是 假设矩阵是对称的(或 hermitian)和 linalg.eigh(确实如此)。使用第二个,一切都很好。