Плохая реконструкция матрицы по собственным векторам в python против R - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь выучить 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)

Спасибо!

Пол

1 Ответ

1 голос
/ 04 мая 2020

Это на самом деле не отвечает на вопрос, но использование np.linalg.svd вместо np.linalg.eig, кажется, работает нормально.

edit на самом деле, теперь я понимаю. numpy имеет linalg.eig, что не предполагает, что матрица симметрична c (или эрмитова) и linalg.eigh (что имеет). Используйте второе, и все хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...