Собственные векторы Python: различия между numpy.linalg, scipy.linalg и scipy.sparse.linalg

Scipy и Numpy имеют между собой три различные функции для поиска собственных векторов для заданной квадратной матрицы:

Сосредоточив внимание на ситуации, когда все необязательные аргументы, которые я оставил с последних двух, остаются по умолчанию и что a/a является реальным, мне любопытно узнать о различиях между этими тремя, являются двусмысленными из документации - особенно:

  • Почему (3) есть заметка о том, что он не может найти все собственные векторы?
  • Почему другие должны вычислять все решения - почему они не принимают аргумент k?
  • (1) имеет примечание о том, что собственные значения возвращаются в определенном порядке; (3) имеет необязательный аргумент для управления порядком. Предоставляет ли (2) какие-либо гарантии по этому поводу?
  • Предполагает ли (3), что a разрежен? (математически говоря, а не представляться как скудная разреженная матрица). Может ли она быть неэффективной или даже давать неправильные результаты, если это предположение не выполняется?
  • Есть ли другие факторы, которые я должен учитывать при выборе между ними?

Ответы

Ответ 1

Особое поведение третьего связано с алгоритмом Ланцоша, который очень хорошо работает с разреженными матрицами. В документации scipy.sparse.linalg.eig говорится, что он использует обертку для ARPACK, которая, в свою очередь, использует "неявно перезапущенный метод Арнольди (IRAM) или, в случае симметричных матриц, соответствующий вариант алгоритма Ланцоша". (1).

Теперь алгоритм Ланцоша обладает тем свойством, что он лучше работает для больших собственных значений (фактически, он использует максимальное собственное значение):

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

Итак, в то время как алгоритм Ланцоша является лишь приближением, я полагаю, что два других метода используют альгоны, чтобы найти точные собственные значения - и, казалось бы, все из них, которые, вероятно, также зависят от используемых алгоритмов.

Ответ 2

Вот ответ нестандартной конкретной части вашего вопроса:

В принципе, процедуры NumPy и SciPy linalg() должны быть одинаковыми. Оба используют внутренние процедуры LAPACK и BLAS. Реализация в `scipy.sparse`` использует специальный алгоритм, который хорошо работает для разреженных матриц (т.е. Матриц с большей частью нулевой записью). Не используйте это, если ваша матрица плотная.

Обратите внимание, что технически eig() в SciPy/NumPy - это разные реализации из-за того, что оба пакета могут быть построены с различными реализациями Lapack/BLAS. Обычный выбор здесь будет стандартным Lapack/BLAS, доступным из netlib, ATLAS, Intel MKL или OpenBLAS.