我正在努力学习python,我遇到了一些令我困惑的事情。为了确保安全,我想确保我可以从其特征向量和特征值重建一个图形拉普拉斯矩阵。在R中,这和预期的一样,但在python中却不一样。python重构的矩阵相差甚远--norm(Laplacian - estimate) ~ 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
似乎可以正常工作。
编辑 其实,现在我明白了。numpy
有 linalg.eig
其中 不 假设矩阵是对称的(或隐性的),且 linalg.eigh
哪些做)。用第二种,就万事大吉了。