Scipy eigsh возвращает неправильные результаты для сложной входной матрицы

Я пытаюсь найти собственные значения и собственные векторы сложной матрицы с помощью scipy.sparse.linalg.eigsh, используя его режим инвертирования сдвига. Имея только вещественные числа в матрице, я получаю тот же результат для решателя spicy.linalg.eigh, но при добавлении мнимых частей собственные значения расходятся. Крошечный пример:

import numpy as np
from scipy.linalg import eigh
from scipy.sparse.linalg import eigsh

n = 10
X = np.random.random((n, n)) - 0.5 + (np.random.random((n, n)) - 0.5) * 1j
X = np.dot(X, X.T)  # create a symmetric matrix

evals_all, evecs_all = eigh(X)
evals_small, evecs_small = eigsh(X, 3, sigma=0, which='LM')

print(sorted(evals_all, key=abs))
print(sorted(evals_small, key=abs))

Отпечатки в этом случае, например,

[0.041577858515751132, -0.084104744918533481, -0.58668240775486691, 0.63845672501004724, -1.2311727737115068, 1.5193345703630159, -1.8652302423152105, 1.9970059660853923, -2.6414593461321654, 2.8624290667460293]
[-0.017278543470343462, -0.32684893256215408, 0.34551438015659475]

тогда как в реальном случае первые три собственных значения идентичны.

Я знаю, что передаю плотную матрицу разреженному решателю, но это просто пример.

Вероятно, я где-то упускаю что-то очевидное, но я был бы рад, если бы мне подсказали, где искать. Спасибо!


person user8763728    schedule 12.10.2017    source источник
comment
Вам нужно conj().T, чтобы делать вещи отшельниками.   -  person percusse    schedule 12.10.2017


Ответы (1)


scipy не проверяет ваш ввод, если он эрмитовский.

Делаем это так, как предложено по ссылке:

if not np.allclose(X, np.asmatrix(X).H):
    raise ValueError('expected symmetric or Hermitian matrix')

выходы:

ValueError: expected symmetric or Hermitian matrix

Я думаю, что на это также указывают те отрицательные собственные значения, которые вы видите (но сложная математика на самом деле не моя специальность ...).

person sascha    schedule 12.10.2017