Подавить пренебрежимо малые комплексные собственные значения? - PullRequest
1 голос
/ 21 марта 2019

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

Ковариационная матрица слишком велика, чтобы размещать ее здесь, нособственные значения выглядят как

[1.38174e01+00j, 9.00153e00+00j, ....]

с наибольшим мнимым компонентом в векторе, пренебрежимо малым при -9.7557e-16j.

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

Есть ли способ подавить возвращение мнимого компонента с помощью numpy eig (или scipy)?Я пытаюсь избежать оператора if, который проверяет, является ли объект собственного значения сложным, а затем устанавливает его только для реальных компонентов, если это возможно.

1 Ответ

1 голос
/ 21 марта 2019

Я думаю, что лучшим решением для этого конкретного случая является использование предложения @ PaulPanzer, то есть np.linalg.eigh .Это работает непосредственно для эрмитовых матриц и, таким образом, будет иметь только реальные собственные значения, именно этот конкретный случай использования.


В общем, получить действительную часть чисел в массиве так же просто, как:1006 *

>>> np.real(np.array([1+1j,2+1j]))
array([ 1.,  2.])

numpy.real возвращает реальную часть ваших чисел.

...