在python与R中从特征向量进行矩阵重建的效果不佳

问题描述 投票:1回答:1

我正在努力学习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)

谢谢你!

保罗

python r eigenvalue eigenvector laplacian
1个回答
1
投票

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

编辑 其实,现在我明白了。numpylinalg.eig 其中 假设矩阵是对称的(或隐性的),且 linalg.eigh 哪些做)。用第二种,就万事大吉了。

© www.soinside.com 2019 - 2024. All rights reserved.