1

我正在尝试学习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)

谢谢!

保罗

4

1 回答 1

1

这并不能真正回答问题,但使用np.linalg.svd代替np.linalg.eig似乎确实可以正常工作。

实际上编辑,现在我明白了。numpy具有linalg.eig不假设矩阵是对称的(或厄米特的)和(确实如此linalg.eigh)。使用第二个,一切都很好。

于 2020-05-04T03:18:41.520 回答